Почему моя IAuthorizationPolicy не устанавливает Thread.CurrentPrincipal с моим CustomPrincipal?

Для своих служб WCF я реализовал IAuthorizationPolicy и подключил его (и могу подтвердить, что он используется).

В методе Evaluate() я устанавливаю собственный принципал следующим образом:

evaluationContext.Properties["Principal"] = myCustomPrincipal;

Однако при вызове службы Thread.CurrentPrincipal является GenericPrincipal!

Поведение моего сервиса настроено следующим образом:

<serviceAuthorization principalPermissionMode="Custom">
    <authorizationPolicies>
        <add policyType="MyNamespace.MyPrincipalAuthorizationPolicy, MyProject, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null" />
    </authorizationPolicies>
</serviceAuthorization>

Я попытался использовать отражатель, чтобы увидеть, что происходит, но не увидел ничего полезного.

Я делаю это неправильно? Есть ли какая-то конфигурация, которую мне не хватает?


person stucampbell    schedule 29.07.2010    source источник


Ответы (1)


Я не удивлен, что вокруг этого вопроса крутились перекати-поле. Нет ничего плохого в подходе, который я подробно описал в вопросе.

Оказывается, проблема заключалась в том, что я использовал пользовательский IInstanceProvider (я даже не подумал включить эту информацию). Если я перестану использовать пользовательский поставщик экземпляров, все будет работать нормально. Но это нехорошо, так как я все еще хочу его использовать.

Поэтому я обнаружил, что единственным решением было вручную установить текущего принципала потока внутри поставщика экземпляров.

Хитрость заключалась в том, чтобы заполучить принцип, который я установил в IAuthorizationPolicy - мне удалось найти его в конце, используя довольно громоздкий вызов через статический OperationContext.Current.

public object GetInstance(InstanceContext instanceContext, Message message)
{
    var principal =
        OperationContext.Current.ServiceSecurityContext.AuthorizationContext.Properties["Principal"] 
            as MyPrincipal;
    if (principal != null)
        Thread.CurrentPrincipal = principal;
    return ObjectFactory.GetInstance(_serviceType);
}

Конечно, мне было бы интересно узнать, есть ли более элегантное решение.

person stucampbell    schedule 03.08.2010
comment
leastпривилегия.com/2007/08/08/custom-principals-and -wcf То же решение и здесь - person Balaji Gunasekaran; 15.01.2015
comment
Спас мою задницу! после того, как много времени я потратил на то, чтобы не найти своего директора - person SomeRandomName; 11.10.2016