Hai ragione, la documentazione su questo non aiuta affatto.
Il modo in cui ho utilizzato questa classe è il seguente. Eseguire l'override del metodo di autenticazione() a:
- Tirare i token di autenticazione (ad esempio nome utente/password) dal messaggio in arrivo
- autenticare il token e li usa per creare un oggetto IPrincipal. Questo sarà il principale utilizzato durante l'invocazione dell'operazione di servizio.
- aggiungere l'oggetto IPrincipal alla raccolta message.Properties modo che possa essere utilizzato in seguito nella pipeline di elaborazione WCF
Non si può semplicemente impostare il principale filo a questo punto come è cambiato in seguito da WCF .
Il codice nella ServiceAuthenticationManager.Authenticate() metodi sarebbero simile a questo:
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;
}
quindi si aggiunge un criterio di autorizzazione personalizzato che
- Recupera l'IPrincipal dal messaggio (utilizzando il Raccolta System.ServiceModel.EvaluationContext.Current.IncomingMessageProperties).
- spinge l'IPrincipal nella collezione EvaluationContext.Properties
- fa affermazioni sulla base del metodo di IPrincipal.IsInRole
() Il codice nella IAuthorizationPolicy() metodo sarebbe simile
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;
}
Nella configurazione del comportamento del servizio, è necessario impostare principalPermissionMode = "Custom" in modo che WCF imposti l'IPrincipal come principale sul thread in esecuzione per l'effettiva operazione di richiamo dell'operazione.
<serviceAuthorization principalPermissionMode="Custom"...
fonte
2010-10-01 13:43:37
E 'strano, ma c'è ancora sembra che ci sia un sacco di informazioni e campioni per ServiceAuthorizationManager, ma quasi nulla per ServiceAuthenticationManager – Cocowalla