Вы правы, документация на это совсем не помогает.
Способ, которым я использовал этот класс, заключается в следующем. Переопределение метода Аутентифицировать() по адресу:
- Потяните маркера аутентификации (например, имя пользователя/пароль) из входящего сообщения
- Аутентифицировать маркеры и использовать их для создания объекта IPrincipal. Это будет принцип, который используется при вызове операции обслуживания.
- Добавить объект IPrincipal в коллекцию message.Properties поэтому он может быть использован позже в конвейере обработки WCF
Вы не можете просто установить нить принципала в этот момент, как она изменяется позже с помощью WCF ,
Код в ServiceAuthenticationManager.Authenticate() методы будут выглядеть примерно так:
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;
}
Затем добавить политику пользовательских авторизации,
- извлекает IPrincipal из сообщения (с помощью System.ServiceModel.EvaluationContext.Current.IncomingMessageProperties).
- Помещает IPrincipal в коллекцию EvaluationContext.Properties
- предъявляет претензии на основе метода IPrincipal.IsInRole
() Код в IAuthorizationPolicy() метод будет выглядеть
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;
}
В конфигурации поведения службы вам необходимо установить mainPermissionMode = «Custom», чтобы WCF установил IPrincipal в качестве принципала в исполняемом потоке для фактического вызова службы.
<serviceAuthorization principalPermissionMode="Custom"...
Это странно, но до сих пор там, кажется, много информации и образцов для ServiceAuthorizationManager, но вряд ли что-нибудь для ServiceAuthenticationManager – Cocowalla