我只使用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是一个关键段落:
If you want to make your RP application claims-aware,but you do not have an STS (for example,the RP uses Forms authentication or Windows integrated authentication),you can use the ClaimsPrincipalHttpModule. This module sits in your application’s HTTP pipeline and intercepts authentication information. It generates a IClaimsPrincipal for each user based on that user’s username,group memberships,and other authentication information. ClaimsPrincipalHttpModule must be inserted at the end of the @H_403_29@<httpModules> pipeline,which is the first element in the @H_403_29@<modules> section of @H_403_29@<system.webServer> on IIS 7.
和这个页面:
给你全班现在将该类添加到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缓存。希望这有助于其他任何人试图做同样的事情,如果我没有做正确的事情请让我知道。