В настоящее время я использую 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, который делает то же самое? Я не хочу помечать каждый метод одинаковым битом объявления атрибута.