Проблемы с использованием IAuthorizationPolicy с WCF и Castle-Windsor - PullRequest
1 голос
/ 17 ноября 2009

В настоящее время я использую Castle-Windsor с WCF Facility для внедрения всех моих услуг WCF. Я только что начал добавлять требования к разрешениям, используя пользовательский IAuthorizationPolicy, который, кажется, работает, когда выполняется для сервиса для каждого метода, но когда сам класс сервиса размечен с требованиями, я получаю исключение.

Я настроил все на основе примера на Как использовать аутентификацию по имени пользователя с Transport Security в WCF из Windows Forms . Я не настраивал пользовательский класс модуля HTTP, так как использую существующую реализацию Membership. Моя IAuthorizationPolicy реализация (HttpContextPrincipalPolicy) практически идентична.

Основная часть моего Web.config:

<serviceBehaviors\>
  <behavior name="MyBehavior">
    <serviceMetadata httpGetEnabled="true" />
    <serviceDebug includeExceptionDetailInFaults="false" />
    <serviceAuthorization principalPermissionMode="UseAspNetRoles"
                          roleProviderName="UserProvider">
      <authorizationPolicies>
        <clear/>
        <add policyType="Website.FormsAuth.HttpContextPrincipalPolicy,Website"/>
      </authorizationPolicies>
    </serviceAuthorization>
  </behavior>
</serviceBehaviors>

Кажется, все работает нормально, когда я ставлю требования к методу. Это делается так:

[PrincipalPermission(SecurityAction.Demand, Role = RoleNames.USER_ADMINISTRATION)]

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

Castle.MicroKernel.ComponentActivator.ComponentActivatorException {
    Message = "ComponentActivator: could not instantiate Services.UserService"
    InnerException = System.Reflection.TargetInvocationException {
        Message = "Exception has been thrown by the target of an invocation."
        InnerException = System.Security.SecurityException {
            Message = "Request for principal permission failed."
        }
    }
}

Я отладил и обнаружил, что вызывается конструктор на HttpContextPrincipalPolicy, но Evaluate() - нет, когда к классу прикреплено требование. Когда он присоединен к методу Evaluate() , вызывается . Итак, на данный момент я дошел до того, что мои навыки новичка .NET / WCF / Castle-Windsor позволят мне.

Есть ли способ сказать Касл-Виндзору, чтобы он вызывал конструктор службы при чтении IAuthorizationPolicy? Или сказать WCF, что Evaluate() нужно вызвать для создания класса? Или есть какой-то другой путь вокруг WCF, который делает то же самое? Я не хочу помечать каждый метод одинаковым битом объявления атрибута.

1 Ответ

1 голос
/ 17 ноября 2009

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

AFAIK, PrincipalPermissionAttribute не поддерживается на уровне класса для WCF из-за характера времени выполнения, даже если это разрешено с точки зрения чисто .NET. Поэтому Castle-Windsor не может создать ваш экземпляр службы по той же причине.

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