我有一个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 + "<br/>");
}
...我没有收到任何增加的声明。相反,我只有ADFS(用户名)给我的原始声明。奇怪的是,如果我将IClaimsPrincipal拉出Session并查询它的索赔集合,我会收回我添加的所有声明。这是怎么回事?
答案 0 :(得分:1)
您应该使用ClaimsAuthenticationManager扩展点来提取更多声明 - 您在那里添加的所有内容都会自动(并且可能正确)保存到身份验证会话中。
答案 1 :(得分: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,否则您将丢失所有更改。