Tienes razón, la documentación sobre esto no es de ninguna ayuda.
La forma en que he usado esta clase es la siguiente. Reemplazar el método Authenticate() para:
- Tire los tokens de autenticación (por ejemplo, nombre de usuario/contraseña) fuera del mensaje entrante
- autenticar el tokens y utilizarlos para crear un objeto IPrincipal. Este será el principal que se usa durante la invocación de la operación del servicio.
- añadir el objeto IPrincipal a la colección message.Properties para que pueda ser utilizado más adelante en la tubería de proceso WCF
No se puede establecer la directora hilo en este punto, ya que se cambió más tarde por la WCF .
El código en el ServiceAuthenticationManager.Authenticate() métodos podrían ser algo como esto:
public override ReadOnlyCollection<IAuthorizationPolicy> Authenticate(ReadOnlyCollection<IAuthorizationPolicy> authPolicy, Uri listenUri, ref Message message)
{
int tokenPosition = message.Headers.FindHeader("Token", "http://customnamespace.org");
string token = message.Headers.GetHeader<string>(tokenPosition);
IPrincipal user = new CustomPrincipal(token);
message.Properties["Principal"] = user;
return authPolicy;
}
Luego se agrega una política de autorización personalizada que
- Recupera el IPrincipal del mensaje (utilizando el System.ServiceModel.EvaluationContext.Current.IncomingMessageProperties collection).
- empuja el IPrincipal en la colección EvaluationContext.Properties
- hace afirmaciones basadas en el método de IPrincipal.IsInRole
() El código en el IAuthorizationPolicy() método se vería
public bool Evaluate(EvaluationContext evaluationContext, ref object state)
{
IPrincipal user = OperationContext.Current.IncomingMessageProperties["Principal"] as IPrincipal;
evaluationContext.Properties["Principal"] = user;
evaluationContext.Properties["Identities"] = new List<IIdentity> { user.Identity };
IList<Claim> roleClaims = this.GetRoleClaims(user);
evaluationContext.AddClaimSet(this, new DefaultClaimSet(this.Issuer, roleClaims));
return true;
}
En la configuración del comportamiento del servicio, debe establecer principalPermissionMode = "Custom" para que WCF configure el IPrincipal como el principal en el hilo de ejecución para la invocación real de la operación del servicio.
<serviceAuthorization principalPermissionMode="Custom"...
Es raro, pero todavía parece que hay una gran cantidad de información y muestras para ServiceAuthorizationManager, pero casi nada para ServiceAuthenticationManager – Cocowalla