我看到了很多类似以下的代码来创建新的ClaimsIdentity和ClaimsPrincipal

var claims = new List<Claim>() {
new Claim(ClaimTypes.Name, "Me"),
new Claim(ClaimTypes.Email, "[email protected]"),
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; }
  ...
}


我认为上述声明varPrincipal = 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中使用多个身份?

最佳答案

有一个构造函数,它将为您完成:

public ClaimsPrincipal(IEnumerable<ClaimsIdentity> identities)


但是,其语义是不确定的。到目前为止,Microsoft尚未使用过它,而且我从未能够将其序列化为可互操作的SAML令牌……我不确定SesAM会如何使用它。

10-04 15:25