WCF AuthorizationPolicy: проблема олицетворения - PullRequest
3 голосов
/ 03 ноября 2010

У меня следующая ситуация (наброски):

Авторизация Webservice
Эта служба вызывается и проверяет (путем выполнения заданной бизнес-логики), является ли пользователь действительным или нет.

Custom Business Webservice
Это некоторый веб-сервис, созданный для бизнес-приложения, который внутренне вызывает «Web-сервис авторизации» для проверки учетной записи, которая вызвала бизнес-веб-сервис.

Я реализовал эту логику, используя авторизацию службы WCF в моем "Custom Business Webservice". В основном я настроил

<serviceAuthorization principalPermissionMode="Custom">
    <authorizationPolicies>
        <add policyType="MyCompany.Authorization.WCF.AuthorizationPolicy, MyCompany.AuthorizationDll"/>
    </authorizationPolicies>
</serviceAuthorization>

AuthorizationPolicy внутренне вызывает «Web-сервис авторизации».

Проблема
Проблема в том, что мне нужно выдать себя за абонента моего "Custom Business Webservice". Идентификатор клиента является правильным, однако WindowsIdentity - это идентификатор пользователя пула приложений.
Обратите внимание, что олицетворение работает внутри самой службы, если я использую [OperationBehavior(Impersonation = ImpersonationOption.Required)], но , оно не в методе AuthorizationPolicy Evaluate(...).

(я использую безопасность на транспортном уровне, очевидно, используя учетные данные для проверки подлинности Windows)

У кого-нибудь есть какие-либо подсказки о том, как я могу выдать себя за вызывающего абонента до входа в метод IAuthorizationPolicy.Evaluate(...) ??

1 Ответ

3 голосов
/ 12 ноября 2010

Всегда снова чувствую себя немного странно, отвечая на мои собственные вопросы, но ради того, чтобы поделиться тем, что я получил с другими, я собираюсь опубликовать здесь «решение».

Я попробуюдля краткости:

  1. Олицетворение в IAuthorizationPolicy.Evaluate (...) невозможно.(S4U2Self может работать, не проверял это, так как у меня не было этой опции)

Как я уже упоминал, олицетворение вызывающей стороны в операции веб-сервиса работало путем размещения [OperationBehavior(Impersonation = ImpersonationOption.Required)].Поэтому вызов моего пользовательского веб-сервиса для извлечения принципала в качестве первого оператора в моей сервисной операции всегда будет работать.Однако такой подход мне не понравился.
В качестве альтернативы я попытался найти последнюю возможную точку в цепочке вызовов операции службы WCF, в которой, наконец, сработало олицетворение.Вот где я нашел OperationInvoker.

Следующая диаграмма иллюстрирует последовательность диспетчеризации, которая выполняется до того, как вызов поступит к фактической операции (взято из здесь ):
alt text

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

Дополнительная информация о соответствующем сообщении в блоге , которое я написал .

...