.net – Windows身份验证的简单索赔转换和缓存

前端之家收集整理的这篇文章主要介绍了.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是一个关键段落:

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 <httpModules> pipeline,which is the first element in the <modules> section of <system.webServer> on IIS 7.

和这个页面

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相关文章