我使用终结点行为配置此服务:
<serviceAuthorization principalPermissionMode ="UseAspNetRoles"
roleProviderName="MyRoleProvider"/>
一个装订:
<security mode="TransportCredentialOnly">
<transport clientCredentialType="Ntlm" />
</security>
当该服务被调用时,
Thread.CurrentPrincipal
会被设置为一个 RolePrincipal
,其中包含客户端 Windows 身份和由配置的提供程序提供的角色。世界一切正常。
现在,我添加了一些额外的 WCF 服务,这些服务通过 REST-ful Ajax 调用进行消费:
svc
文件中的 Factory="System.ServiceModel.Activation.WebScriptServiceHostFactory"
、服务契约中的 WebGet
属性以及服务实现中的 AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Allowed)
属性。我还按照 MSDN 的建议向 web.config 添加了以下咒语:
<system.serviceModel>
...
<serviceHostingEnvironment aspNetCompatibilityEnabled="true" />
...
</system.serviceModel>
我的 Ajax 服务几乎按照我想要的方式工作。当它被调用时,
HttpContext.Current.User
被设置为一个带有我期望的角色的 RolePrincipal
。但是,Thread.CurrentPrincipal
仍然被设置为未经身份验证的 GenericPrincipal
。因此,我需要在每个服务方法中添加一行代码:
Thread.CurrentPrincipal = HttpContext.Current.User
配置文件中是否有任何咒语可以自动设置
Thread.CurrentPrincipal
,就像普通SOAP服务一样?更新:这里 有个博客,作者也遇到了同样的问题,并通过实现自定义行为来解决它。肯定有一种方法可以直接解决这个问题吧?
更新2:我回来给这个问题添加一个赏金,因为在一个新项目中,我正在使用.NET 3.5上的WCF WebGet启用的服务。
我尝试了许多选项,包括设置principalPermissionMode =“None”,但没有任何作用。以下是发生的情况:
我导航到调用我的服务的WebGet URL:
http://myserver/MyService.svc/...
。在Global.asax的"Application_AuthorizeRequest"中设置了一个断点。当命中此断点时,"HttpContext.Current.User"和"Thread.CurrentPrincipal"都已设置为使用我配置的ASP.NET RoleProvider的"RolePrincipal"。这是我想要的行为。
当调用我的服务的OperationContract方法时,我有第二个断点。当命中此断点时,HttpContext.Current.User仍然引用我的RolePrincipal,但Thread.CurrentPrincipal已更改为GenericPrincipal。烦死了!
我看到建议实现自定义IAuthorizationPolicy,如果找不到更好的解决方案,我会研究一下。但是为什么我需要实现自定义策略才能使用现有的ASP.NET授权功能呢?如果我的principalPermissionMode =“UseAspNetRoles”,那么WCF应该知道我想要什么吧?