2010-07-11 10 views

Respuesta

8

¿Está refiriéndose a cómo agregar AuthorizationPolicy a través del código? No probado, pero creo que algo como esto debería funcionar:

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

Gracias. ¿También puede mostrar cómo especifico el CustomValidator con el código? – jgauffin

+0

De nuevo, no lo he intentado, pero ServiceCredentials es solo otro comportamiento de servicio, por lo que debería poder crear una instancia de ServiceCredentialsElement, establecer las propiedades UserNameAuthentication, luego invocar CreateBehavior() y agregarlo al ServiceHost. – tomasr

0

Si se refiere a la this topic (WCF Security: Getting the password of the user) by Rory Primrose, logra similar a lo que está preguntando con la provisión de un validador personalizado, siendo el método de extensión importante 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(); 
    } 
} 

para utilizar esta credencial servicio personalizado, se deberá especificar el atributo type en el <ServiceCredentials> 's ConfigurationElement en su configuración, como:

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

Del mismo modo, puede establecer este atributo type programáticamente, pero no estoy familiarizado con cómo.

+1

No leyó mi pregunta correctamente. Por favor, hazlo. – jgauffin

+0

Lo siento, pero he hecho toda mi personalización de WCF a través de extensiones de configuración (es decir, elementos de extensión), pero siguiendo el ejemplo de tomasr, creo que está sugiriendo que puede establecer su CustomValidator configurando las siguientes propiedades en el objeto 'UserNamePasswordServiceCredential' al que se accede utilizando 'ServiceHostBase.Description.Behaviours.Find (). UserNameAuthentication':' UserNamePasswordValidationMode = UserNamePasswordValidationMode.Custom' y 'UserNamePasswordValidator = new MyCustomValidator()'. ¡Espero que esto ayude! – Rabid

+1

Bueno, eso no es explícitamente lo que recomienda, creo que sugiere que puedas construir tu propia construcción de configuración de credenciales de servicio desde cero ('ServiceCredentialsElement'), establecer todas las propiedades relevantes (incluido el' UserNameAuthentication'), luego sustituir cualquier 'ServiceCredentials' ya presente dentro de los comportamientos del host del servicio descrito mediante la construcción del comportamiento a través de 'ServiceCredentialsElement.CreateBehaviour()' - aunque no es sencillo porque se declara como 'objeto interno abstracto protegido CreateBehavior() 'en' BehaviorExtensionElement' – Rabid

Cuestiones relacionadas