Почему мой IAuthorizationPolicy не устанавливает Thread.CurrentPrincipal с моим CustomPrincipal? - PullRequest
5 голосов
/ 29 июля 2010

Для моих служб 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>

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

Я делаю это неправильно? Мне не хватает какой-то конфигурации?

1 Ответ

5 голосов
/ 03 августа 2010

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

Оказывается, проблема заключалась в том, что я использовал пользовательский 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);
}

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...