.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
 
