在ClaimsPrincipal中添加多个身份

时间:2014-07-08 18:13:51

标签: c# asp.net-mvc authentication wif claims-based-identity

我看到很多代码如下所示来创建一个新的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中使用多个身份的建议吗?

1 个答案:

答案 0 :(得分:1)

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

public ClaimsPrincipal(IEnumerable<ClaimsIdentity> identities)

但是,这种语义是未定义的。到目前为止,微软还没有使用它,我从来没能将它序列化为可互操作的SAML令牌......我不确定SesAM会用它做什么。