首页 文章

ASP.NET添加的声明丢失

提问于
浏览
1

我有一个asp.net应用程序,通过ADFS对第三方进行身份验证 . 身份验证成功后,用户将被重定向到登录页面,从而从数据库中提取用户的声明 . 我使用以下代码填充用户的声明:

IClaimsPrincipal principal = Thread.CurrentPrincipal as IClaimsPrincipal;
IClaimsIdentity claimsIdentity = (IClaimsIdentity)principal.Identity;

foreach (string claim in customClaims)
{
  Claim newClaim = new Claim(ClaimTypes.Role, claim);                
  claimsIdentity.Claims.Add(newClaim);
}

填写完索赔后,我将IClaimsPrincipal保存到会话中 . 事情变得奇怪了 . 用户从登录页面重定向到其所需页面后,索赔将丢失 . 如果我使用以下代码查询声明...

IClaimsPrincipal principal= Thread.CurrentPrincipal as IClaimsPrincipal;
IClaimsIdentity claimsIdentity = (IClaimsIdentity)principal.Identity;

foreach (Claim claim in claimsIdentity.Claims)
{
  Response.Write(claim.ClaimType + ": " + claim.Value + "
"); }

...我没有收到任何增加的索赔 . 相反,我只有ADFS(用户名)给我的原始声明 . 奇怪的是,如果我将IClaimsPrincipal拉出Session,并查询它的声明集合,我会收回我添加的所有声明 . 这里发生了什么?

2 回答

  • 1

    您应该使用ClaimsAuthenticationManager扩展点来提取更多声明 - 您在那里添加的所有内容都将自动(并且可能正确)保存到身份验证会话中 .

  • 1

    添加声明后尝试更新会话Cookie,例如:

    var user = HttpContext.User as ClaimsPrincipal;
    var claims = new List<Claim>();
    
    claims.Add(new Claim("MyClaimType", "MyClaimValue"));
    user.AddIdentity(new ClaimsIdentity(claims));
    
    // Update cookie 
    var sam = FederatedAuthentication.SessionAuthenticationModule; 
    
    if (sam != null) 
    { 
      var token = new SessionSecurityToken(user); 
      sam.WriteSessionTokenToCookie(token); 
    }
    

    我相信如果您操作“受理策略控制”之类的“WIF控制”方法之外的声明,则必须手动更新身份验证会话cookie,否则您将丢失所有更改 .

相关问题