1

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

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 + "<br/>");
}

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

4

2 回答 2

1

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

于 2013-09-19T10:41:09.620 回答
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 控制”方法(如 ClaimsAuthorizationManager)之外操作声明,那么您必须手动更新身份验证会话 cookie,否则您将丢失所有更改。

于 2013-09-22T21:38:44.160 回答