Masz rację, dokumentacja na tym nie pomaga.
Sposób w jaki używałem tej klasy jest następujący. Zastąpić metodę do uwierzytelniania():
- Pociągnąć znaki uwierzytelniania (na przykład nazwa użytkownika/hasło) z wiadomości przychodzących
- uwierzytelnienia żetony i wykorzystać je do utworzenia obiektu IPrincipal. Będzie to główna nazwa używana podczas wywoływania operacji usługi.
- Dodaj obiekt IPrincipal do kolekcji message.Properties dzięki czemu może być używany później w rurociągu przetwarzania WCF
Nie można po prostu ustawić głównego wątku w tym momencie, jak to zostanie zmienione później przez WCF .
Kod w ServiceAuthenticationManager.Authenticate() metody wyglądałby mniej więcej tak:
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;
}
Następnie dodać politykę autoryzacji zwyczaj, że
- pobiera IPrincipal z wiadomości (przy użyciu Kolekcja System.ServiceModel.EvaluationContext.Current.IncomingMessageProperties).
- Odkłada IPrincipal do kolekcji EvaluationContext.Properties
- Sprawia roszczeń opartych na IPrincipal.IsInRole metoda
() Kod w IAuthorizationPolicy() metoda będzie wyglądać
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;
}
W konfiguracji zachowania usługi należy ustawić metodę principalPermissionMode = "Niestandardowa", aby funkcja WCF ustawiła wartość IPrincipal jako główną w wątku wykonawczym dla faktycznego wywołania operacji usługi.
<serviceAuthorization principalPermissionMode="Custom"...
To dziwne, ale wciąż wydaje się być dużo informacji i próbek do ServiceAuthorizationManager, ale prawie nic o ServiceAuthenticationManager – Cocowalla