在过去的几天里,我一直在阅读关于Windows身份基础以及它如何如此优秀和灵活并且内置于.net 4.5的内容.尽管经历了几十个api,博客文章,操作方法等等,但我无法为我的生活做一个简单的实现工作.
我只使用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, Version=4.0.0.0, Culture=neutral, PublicKeyToken=B77A5C561934E089" />
</configSections>
<system.identityModel>
<identityConfiguration>
<claimsAuthenticationManager type="SecurityProj.MyClaimsTransformationModule,SecurityProj" />
<claimsAuthorizationManager type="SecurityProj.MyClaimsAuthorizationManager,SecurityProj" />
</identityConfiguration>
</system.identityModel>
Run Code Online (Sandbox Code Playgroud)
但是,认证管理器永远不会被调用.我可以通过以下方式添加:
protected void Application_PostAuthenticateRequest()
{
ClaimsPrincipal currentPrincipal = ClaimsPrincipal.Current;
ClaimsTransformationModule customClaimsTransformer = new MyClaimsTransformationModule();
ClaimsPrincipal tranformedClaimsPrincipal = customClaimsTransformer.Authenticate(string.Empty, currentPrincipal);
HttpContext.Current.User = tranformedClaimsPrincipal;
}
Run Code Online (Sandbox Code Playgroud)
到我的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);
Run Code Online (Sandbox Code Playgroud)
但我也不确定那部分,转换问题需要先修复.
任何帮助,将不胜感激.只需要调用查找/转换和cookie集,谢谢.