2010-07-11 8 views

cevap

8

AuthorizationPolicy kodunu kod aracılığıyla nasıl eklediğinizden bahsediyor musunuz? Test edilmemiş, ama böyle bir şey çalışması gerekir inanıyoruz:

ServiceHost host = ...; 
var col = new ReadOnlyCollection<IAuthorizationPolicy>(new IAuthorizationPolicy[] { new MyPolicy() }); 

ServiceAuthorizationBehavior sa = host.Description.Behaviors.Find<ServiceAuthorizationBehavior>(); 
if (sa == null) { 
    sa = new ServiceAuthorizationBehavior(); 
    host.Description.Behaviors.Add(sa); 
} 
sa.ExternalAuthorizationPolicies = col; 
+1

Teşekkürler. CustomValidator'u kodla nasıl belirlediğimi de gösterir misiniz? – jgauffin

+0

Yine, denemedim, ancak ServiceCredentials yalnızca başka bir hizmet davranışıdır, bu nedenle bir ServiceCredentialsElement örneği oluşturup UserNameAuthentication özelliklerini ayarlayın, sonra CreateBehavior() öğesini çağırıp ServiceHost'a ekleyin. – tomasr

0

Eğer this topic (WCF Security: Getting the password of the user) by Rory Primrose başvurursanız, o önemli uzatma yöntemi CreateSecurityTokenManager olmanın ne özel bir doğrulayıcı sağlayan ilgili bilgi arıyorsanız benzer ulaşır:

<serviceCredentials type="your.assembly.namespace.PasswordServiceCredentials, 
    your.assembly, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null" > 
</serviceCredentials> 
01:

public class PasswordServiceCredentials : ServiceCredentials 
{ 
    public PasswordServiceCredentials() 
    { 
    } 

    private PasswordServiceCredentials(PasswordServiceCredentials clone) 
     : base(clone) 
    { 
    } 

    protected override ServiceCredentials CloneCore() 
    { 
     return new PasswordServiceCredentials(this); 
    } 

    public override SecurityTokenManager CreateSecurityTokenManager() 
    { 
     // Check if the current validation mode is for custom username password validation 
     if (UserNameAuthentication.UserNamePasswordValidationMode == UserNamePasswordValidationMode.Custom) 
     { 
      return new PasswordSecurityTokenManager(this); 
     } 

     Trace.TraceWarning(Resources.CustomUserNamePasswordValidationNotEnabled); 

     return base.CreateSecurityTokenManager(); 
    } 
} 
, şöyle yapılandırmanızda <ServiceCredentials> 'ın ConfigurationElement üzerinde türü özelliğini belirtmek gerekir bu özel hizmeti kimlik kullanmak için

Benzer şekilde, bu type özniteliğini programatik olarak ayarlayabilirsiniz, ancak nasıl olduğunu bilmiyorum.

+1

Sorumu düzgün bir şekilde okumadınız. Lütfen yap. – jgauffin

+0

Üzgünüz, ancak WCF'nin tüm özelleştirmelerini yapılandırma uzantıları (yani, uzantı öğeleri) aracılığıyla yaptım, ancak tomasr'ın önerisinden sonra, CustomValidator'unuzu kullanarak erişilen 'UserNamePasswordServiceCredential 'nesnesinde aşağıdaki özellikleri ayarlayarak önerebildiğinize inanıyorum. ServiceHostBase.Description.Behaviours.Find (). UserNameAuthentication': 'UserNamePasswordValidationMode = UserNamePasswordValidationMode.Custom' ve' UserNamePasswordValidator = new MyCustomValidator() '. Bu yardımcı olur umarım! – Rabid

+1

Açıkça önerdiği gibi, kendi hizmet kimlik bilgilerinizi yapılandırma yapınızı (“ServiceCredentialsElement”) sıfırdan oluşturabileceğinizi, ilgili tüm özellikleri ("KullanıcıAdıAdı Kimlik Doğrulaması" dahil) ayarlayabileceğinizi ve sonra herhangi bir "HizmetKimliği" nin yerini tutabileceğini düşünüyorum. 'ServiceCredentialsElement.CreateBehaviour() 'yoluyla davranışı yapılandırarak açıklanan hizmet ana bilgisayarı davranışları içinde zaten var - düzlemde değil, çünkü" BehaviorExtensionElement "üzerinde korumalı iç soyut Object CreateBehavior()' olarak bildirildiğinden – Rabid

İlgili konular