asp.net – Thread.CurrentPrincipal在使用WebGet调用的WCF服务
我在IIS中托管了一个使用
Windows身份验证并公开WCF Web服务的网站.
我使用端点行为配置此服务: <serviceAuthorization principalPermissionMode ="UseAspNetRoles" roleProviderName="MyRoleProvider"/> 和约束力 <security mode="TransportCredentialOnly"> <transport clientCredentialType="Ntlm" /> </security> 当服务被调用时,Thread.CurrentPrincipal被设置为一个RolePrincipal,客户端的Windows身份和角色由配置的提供者提供. 一切都与世界很好. 现在,我已经添加了一些额外的WCF服务,这些服务是由svc文件中的REST-Ajax调用消耗的:Factory =“System.ServiceModel.Activation.WebScriptServiceHostFactory”,服务合同中的WebGet属性和AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode).允许)属性在服务实现. 我也在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服务一样? UPDATE 更新2 我已经尝试了许多选项,包括设置principalPermissionMode =“None”,但没有任何作用.发生这种情况: >我导航到调用我的服务的WebGet URL:http://myserver/MyService.svc / … 我已经看到了implement a custom IAuthorizationPolicy的建议,并会研究如果我没有找到更好的解决方案,但为什么我需要实现一个自定义策略来利用现有的ASP.NET授权功能?如果我有principalPermissionMode =“UseAspNetRoles”,肯定WCF应该知道我想要什么? 解决方法
这是个有趣的问题.我没有和你一样的设置,所以很难测试我的建议是否会适用于你的用例,但是我可以分享一些类似的项目为我们工作的东西.
我们如何保持Thread.CurrentPrincipal和HttpContext.Current.User同步 我们写了一个名为“AuthenticationModule”的HttpModule,它继承自IHtppModule. 然后我们将HttpApplication.AuthenticateRequest事件附加到请求生命周期的早期. 在我们的AuthenticateRequest事件处理程序中,我们实现了我们的应用程序特定的需求,包括设置Thread.CurrentPrincipal,如果需要,还可以设置当前的上下文用户.这样,您只需为整个应用程序实施一次代码,如果它更改(如实现自定义的Principal IIDentity),则只需要一个更改它的位置. (请勿在每种服务方式中复制此代码.) public class AuthenticationModule : IHttpModule { public void Dispose() { return; } public void Init(HttpApplication app) { app.AuthenticateRequest += new EventHandler(app_AuthenticateRequest); } void app_AuthenticateRequest(object sender,EventArgs e) { HttpApplication app = (HttpApplication)sender; // This is what you were asking for,but hey you // could change this behavior easily. Thread.CurrentPrincipal = app.Context.User; } } 实际上我们实现了一个自定义的IIdentity,创建一个GenericPrincipal的实例,然后将它分配给app.Context.User和Thread.CurrentPrincipal;但是,以上是你要求的. 不要忘记在您的web.config中注册新的HttpModule! 对于集成应用程序池: <system.webServer> <modules> <add name="AuthenticationModule" type="YourNameSpace.AuthenticationModule" preCondition="integratedMode" /> </modules> </system.webServer> 对于旧的经典应用程序池,您必须将其放在< system.web>< httpModules>< / httpModules>< /system.webu0026gt; 您可能需要播放AuthenticationRequest事件处理程序和/或注册处理程序的顺序.因为我们完全是自定义的,它可能与你所需要的不一样.我们实际上抓住了Forms Authentication cookie,解密它等等…你可能需要ping一些内置的WindowsAuthentication方法. 我相信这是处理您的应用程序身份验证的更通用的方法,因为它适用于所有HttpRequests,无论是页面请求,IHttpHandler,某些第三方组件等…这将保持在您的应用程序中一致. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
- asp.net-mvc – 使用Asp.net Mvc缩略图
- ASP.NET -- WebForm -- ViewState
- asp.net – 用于验证的数据注释,至少一个必填字段?
- 如何在asp.net应用程序中找到i / o瓶颈
- asp.net-web-api – 可以从Request对象获取当前的MediaType
- JSON在ASP.NET中使用方法
- asp.net-mvc – WebService还是一个简单的MVC控制器?
- asp.net-mvc – 在局部视图中Model为null
- asp.net – ASP .NET ProcessModel配置
- asp.net – MVC 6 WebAPI返回序列化的HttpResponseMessage而
- ASP.NET Core 1.0 ConfigurationBuilder().AddJs
- ASP.NET:如何从通用处理程序获取文件的虚拟路径
- asp.net-mvc – 动作过滤器异常
- asp.net-mvc-3 – ASP.NET MVC 3从控制器返回.cs
- asp.net-mvc – NHibernate – 懒惰地初始化一个
- asp.net-core – 如何将ASP.NET 5从Beta6升级到B
- asp.net-web-api – ASP.NET Web API中的回调方法
- 使用jackson将asp.net / MS专有的json Dateforma
- 将ASP.NET updatepanel与jQuery UI DatePicker结
- ASP.NET MVC3模型验证DataAnnotations使用客户端