2010-07-11 7 views

Antwort

8

Beziehen Sie sich darauf, wie Sie die AuthorizationPolicy durch Code hinzufügen? Ungeprüfte, aber ich glaube, so etwas wie dies funktionieren sollte:

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

Danke. Können Sie auch zeigen, wie ich den CustomValidator mit Code spezifiziere? – jgauffin

+0

Noch einmal, ich habe es nicht versucht, aber ServiceCredentials ist nur ein weiteres Service-Verhalten, so dass Sie in der Lage sein sollten, nur eine Instanz von ServiceCredentialsElement zu erstellen, die UserNameAuthentication-Eigenschaften festlegen, CreateBehavior() darauf aufrufen und zum ServiceHost hinzufügen. – tomasr

0

Wenn Sie auf die this topic (WCF Security: Getting the password of the user) by Rory Primrose beziehen, erreicht er ähnlich dem, was Sie erkundigt mit einer benutzerdefinierten Validator-Bereitstellung, die wichtige Erweiterung Methode ist CreateSecurityTokenManager:

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(); 
    } 
} 

um diese benutzerdefinierte Dienstanmeldeinformationen verwenden, werden Sie das type-Attribut auf die <ServiceCredentials> ‚s ConfigurationElement in Ihrer Konfiguration, wie angeben müssen:

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

In ähnlicher Weise könnten Sie dieses Attribut type programmatisch festlegen, aber ich bin nicht vertraut mit wie.

+1

Sie haben meine Frage nicht richtig gelesen. Bitte. – jgauffin

+0

Tut mir leid, aber ich habe meine ganze Anpassung von WCF durch Konfigurationserweiterungen (dh Erweiterungselemente) gemacht, aber aus der Sicht von tomasr glaube ich, dass er vorschlägt, Sie können Ihren CustomValidator einstellen, indem Sie die folgenden Eigenschaften für das 'UserNamePasswordServiceCredential' Objekt festlegen, auf das zugegriffen wird 'ServiceHostBase.Description.Behaviours.Find (). UserNameAuthentication':' UserNamePasswordValidationMode = UserNamePasswordValidationMode.Custom' und 'UserNamePasswordValidator = new MyCustomValidator()'. Hoffe das hilft! – Rabid

+1

Nun, das ist nicht explizit, was er empfiehlt, ich glaube, er schlägt vor, dass Sie Ihre eigenen Service-Credentials Konfigurationskonstrukt von Grund auf neu erstellen ('ServiceCredentialsElement'), setzen Sie alle relevanten Eigenschaften (einschließlich der' UserNameAuthentication'), dann ersetzen Sie alle 'ServiceCredentials' bereits in den beschriebenen Service-Host-Verhaltensweisen vorhanden, indem das Verhalten über 'ServiceCredentialsElement.CreateBehaviour()' konstruiert wird - jedoch nicht direkt, weil es als 'geschütztes internes abstraktes Objekt CreateBehavior()' auf 'BehaviorExtensionElement' deklariert ist – Rabid

Verwandte Themen