.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缓存。希望这有助于其他任何人试图做同样的事情,如果我没有做正确的事情请让我知道。 (编辑:莱芜站长网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
- 如何解决 Windows 实例出现身份验证错误及更正 CredSSP
- windows-7 – 无法完成操作,因为文件夹或其中的文件在另一个
- 开发了一款写作软件(OSX,Windows),附带Electron开发指南
- xaml – 如何在关闭时为SettingsFlyout设置动画
- 本地windows上安装protobuf和thrit环境
- Windows Server 2016-存储新增功能
- windows-phone-8 – LongListMultiSelector将CheckBox与列表
- window python2.7 ImportError: No module named MySQLdb
- win10家庭版 远程桌面 身份验证错误,要求的函数不受支持,
- 在 Windows 下安装 Scrapy