У меня есть веб-сайт, размещенный в IIS, который использует проверку подлинности Windows и предоставляет веб-службы WCF.
Я настраиваю эту службу с поведением конечной точки:
<serviceAuthorization principalPermissionMode ="UseAspNetRoles"
roleProviderName="MyRoleProvider"/>
и привязкой:
<security mode="TransportCredentialOnly">
<transport clientCredentialType="Ntlm" />
</security>
Когда вызывается служба, Thread.CurrentPrincipal
устанавливается на RolePrincipal
с идентификатором Windows клиента и ролями, предоставленными настроенным провайдером.
Все в порядке с миром.
Теперь я добавил несколько дополнительных служб WCF, которые используются вызовами REST-ful Ajax: Factory="System.ServiceModel.Activation.WebScriptServiceHostFactory"
в файле svc, атрибут WebGet
в контракте на обслуживание и атрибут AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Allowed)
вреализация службы.
Я также добавляю следующее заклинание в web.config, как рекомендовано в MSDN:
<system.serviceModel>
...
<serviceHostingEnvironment aspNetCompatibilityEnabled="true" />
...
</system.serviceModel>
Моя служба Ajax почти работает так, как я хочу,Когда он вызывается, HttpContext.Current.User
устанавливается на RolePrincipal
с ролями, которые я ожидаю.Но Thread.CurrentPrincipal
остается установленным без проверки подлинности GenericPrincipal
.
Поэтому мне нужно добавить строку кода для каждого из моих методов обслуживания:
Thread.CurrentPrincipal = HttpContext.Current.User
Есть ли какие-либо заклинания вфайл конфигурации, который я могу использовать для автоматической установки Thread.CurrentPrincipal
, как для обычной службы SOAP?
ОБНОВЛЕНИЕ Вот блог от кого-то, у кого былта же проблема, и решил ее путем реализации пользовательских поведений.Конечно, есть способ сделать это из коробки?
ОБНОВЛЕНИЕ 2 Возвращаясь, чтобы добавить награду к этому, поскольку это снова вызывает меня в новом проекте, используя WCF с поддержкой WebGetСлужба в .NET 3.5.
Я экспериментировал с рядом опций, включая установку PrincipalPermissionMode = "None", но ничего не работает.Вот что происходит:
Я перехожу на URL WebGet, который вызывает мою службу: http://myserver/MyService.svc/...
Я установил точку останова в Global.asax "Application_AuthorizeRequest".Когда достигается эта точка останова, для обоих «HttpContext.Current.User» и «Thread.CurrentPrincipal» устанавливается значение «RolePrincipal», в котором используется мой настроенный ASP.NET RoleProvider.Это поведение, которое я хочу.
У меня есть вторая точка останова, когда вызывается метод OperationContract моей службы.При достижении этой точки останова HttpContext.Current.User по-прежнему ссылается на мой RolePrincipal, но Thread.CurrentPrincipal был изменен на GenericPrincipal.Aaargh.
Я видел предложения реализовать пользовательскую IAuthorizationPolicy , и рассмотрим это, если я не найду лучшего решения, но почему я долженВам нужно реализовать собственную политику для использования существующих функций авторизации ASP.NET?Если у меня есть PrincipalPermissionMode = "UseAspNetRoles", конечно, WCF должен знать, что я хочу?