.net – Windows身份验证的简单索赔转换和缓存
在过去几天,我一直在阅读Windows身份基础,以及它如何良好和灵活,并且正确地构建到.net 4.5中。尽管过了几十个apis,博客帖子,how-to的等等,我不能为我的生活一个简单的实现工作。
我只使用Windows身份验证,我可以得到委托人并查看它附带的声明(这是每个例子似乎都结束的地方)。然而,我想将它们转化为有用的声明,并缓存结果,以便转换不会在每个请求上发生。 在我的web.config我有: <configSections> <section name="system.identityModel" type="System.IdentityModel.Configuration.SystemIdentityModelSection,System.IdentityModel,Version=4.0.0.0,Culture=neutral,PublicKeyToken=B77A5C561934E089" /> <section name="system.identityModel.services" type="System.IdentityModel.Services.Configuration.SystemIdentityModelServicesSection,System.IdentityModel.Services,PublicKeyToken=B77A5C561934E089" /> </configSections> <system.identityModel> <identityConfiguration> <claimsAuthenticationManager type="SecurityProj.MyClaimsTransformationModule,SecurityProj" /> <claimsAuthorizationManager type="SecurityProj.MyClaimsAuthorizationManager,SecurityProj" /> </identityConfiguration> </system.identityModel> 但是,身份验证管理器永远不会被调用。我可以让它做的工作的唯一方法是添加: protected void Application_PostAuthenticateRequest() { ClaimsPrincipal currentPrincipal = ClaimsPrincipal.Current; ClaimsTransformationModule customClaimsTransformer = new MyClaimsTransformationModule(); ClaimsPrincipal tranformedClaimsPrincipal = customClaimsTransformer.Authenticate(string.Empty,currentPrincipal); HttpContext.Current.User = tranformedClaimsPrincipal; } 到我的global.asax.cs文件。它工作在第一个请求,但后来我得到“安全句柄已经关闭”错误之后,不知道是什么导致它。显然,这不是正确的做法,有谁知道最好还是简单的工作做法呢?这只是为了Windows身份验证,我不需要任何比这更复杂的东西。 对于缓存,我试图使用: SessionSecurityToken token = FederatedAuthentication.SessionAuthenticationModule .CreateSessionSecurityToken( currentPrincipal,"Security test",System.DateTime.UtcNow,System.DateTime.UtcNow.AddHours(1),true); if (FederatedAuthentication.SessionAuthenticationModule != null && FederatedAuthentication.SessionAuthenticationModule.ContainsSessionTokenCookie(HttpContext.Current.Request.Cookies)) { return; } FederatedAuthentication.SessionAuthenticationModule.WriteSessionTokenToCookie(token); 但我也不确定这一点,转型问题需要先修好。 任何帮助将不胜感激。谢谢你只需要调用查找/转换和一个cookie集。
我现在有一切工作,这是我如何去做的:
在这个页面上:http://msdn.microsoft.com/en-us/library/ee517293.aspx是一个关键段落:
和这个页面: http://leastprivilege.com/2012/04/04/identity-in-net-4-5part-2-claims-transformation-in-asp-net-beta-1/ 给你全班现在将该类添加到web.config中: <modules> <add name="ClaimsTransformationHttpModule" type="TestSecurity.ClaimsTransformationHttpModule" /> </modules> 现在它将调用转换,我可以删除global.asax中的后验证方法。 在认证方法中,我称之为设置cookie: private void CreateSession(ClaimsPrincipal transformedPrincipal) { SessionSecurityToken sessionSecurityToken = new SessionSecurityToken(transformedPrincipal,TimeSpan.FromHours(8)); FederatedAuthentication.SessionAuthenticationModule.WriteSessionTokenToCookie(sessionSecurityToken); } 来自之前的模块已经设置为查看它,并跳过验证(如果存在)。 最后是我不断得到的安全处理错误。我不完全确定原因,但是我发现如果我修改了被传递给Authenticate的主体,然后返回它(这在msdn上显示),那么错误将显示在所有后续请求中。但是,如果我创建并返回一个新的委托人,那么它不会发生。这也可以用于删除您不需要的声明。 List<Claim> newClaims = new List<Claim>(); var keeper = ((ClaimsIdentity)incomingPrincipal.Identity).Claims.First(c => c.Type == ClaimTypes.Name); newClaims.Add(keeper); ClaimsIdentity ci = new ClaimsIdentity(newClaims,"Negotiate"); return new ClaimsPrincipal(ci); 所以现在我可以windows验证,引入自定义的声明,并让他们用cookie缓存。希望这有助于其他任何人试图做同样的事情,如果我没有做正确的事情请让我知道。 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
- windows7环境下的http-server的安装
- windows-server-2003 – 如何抢救RAID配置?
- 推送通知 – 了解Windows Phone 8.1的推送通知
- 在Windows上如何实现Python多处理?
- 我是否需要添加此头文件“stdafx.h”以在Windows中运行c程序
- windows-server-2008 – whenChanged Active Directory属性
- win10下面opencv安装
- windows-8 – 错误提交应用程序更新:打包Windows 8.1(桌面
- windows-xp – Windows桌面应用程序的使用情况跟踪
- 仅限Windows 7上的.NET 4串行端口ObjectDisposedException