在ClaimsPrincipal中添加多个身份认证

5
我看到很多以下代码用于创建新的ClaimsIdentity和ClaimsPrincipal:
var claims = new List<Claim>() {
new Claim(ClaimTypes.Name, "Me"),
new Claim(ClaimTypes.Email, "email@me.com"),
new Claim(ClaimTypes.Role, "Admin")
};

var id = new ClaimsIdentity(claims, "Forms");
var principal = new ClaimsPrincipal(id);

这很简单,网络上有很多关于如何做到这一点的示例。我想做的是,在ClaimsPrincipal中拥有多个身份,但我没有找到太多关于这方面的文档。如下所示,ClaimsPrincipal被定义为可以支持多个身份,因此这是可行的。

public class ClaimsPrincipal : IPrincipal
{
  public virtual IEnumerable<ClaimsIdentity> Identities { get; }
  ...
}

我认为上述的声明var principal = new ClaimsPrincipal(id) 的方法是不够充分的,因为我需要能够向已经有身份的ClaimsPrincipal添加一个新的身份。那么,如果您已经在ClaimsPrincipal中具有身份,并声明了一个新的ClaimsPrincipal实例,会发生什么情况?现在您是否拥有两个具有不同身份的ClaimsPrincipal实例?我的直觉是这种情况确实如此,因此我需要检查当前ClaimsPrincipal的存在并像这样添加:

ClaimsPrincipal principal;
if(System.Security.Claims.ClaimsPrincipal.Current != null)
{
   principal = System.Security.Claims.ClaimsPrincipal.Current;
   principal.AddIdentity(id)

}
else
{
   principal = new ClaimsPrincipal(id);
}

我是否在正确的道路上?有没有人能够深入了解当ClaimsPrincipal中存在多个身份时,在幕后发生了什么。如果我不是在正确的轨道上,能否提供关于如何在ClaimsPrincipal中使用多个身份的建议?


可能是重复的问题:如何从ClaimsPrincipal中删除ClaimsIdentity - Erik Philips
它们不是重复的。一个人正在询问如何添加标识,另一个人则是关于删除标识的问题。虽然相似,但涉及到不同的考虑。 - Louise Eggleton
1个回答

2

有一个构造函数可以为您完成这个操作:

public ClaimsPrincipal(IEnumerable<ClaimsIdentity> identities)

然而,这个的语义是未定义的。Microsoft到目前为止还没有使用它,我也无法将其序列化为可互操作的SAML令牌......我不确定SesAM会对其做什么。


谢谢回答。是的,我看到了,但是不知道如何使用它。最终我直接从令牌中获取身份集合,并在该级别上添加或删除身份,然后从ClaimsIdenties集合重新创建ClaimsPrincipal。类似这样:identities = handler.ValidateToken(token, cookieHandler.Path)。我会在周末更新我最终得出的代码并提出我的问题。 - Louise Eggleton
1
当您添加具有主题声明的多个标识,并尝试从主体中检索主题声明时,可能会变得混乱 - 它应该返回哪一个?ClaimsPrincipal具有默认的主要标识,但不确定在多个标识的情况下应由谁和如何设置它。 - JustAMartin

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接