我看到很多代码如下所示来创建一个新的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中使用多个身份的建议吗?
答案 0 :(得分:1)
有一个构造函数,它将为您完成:
public ClaimsPrincipal(IEnumerable<ClaimsIdentity> identities)
但是,这种语义是未定义的。到目前为止,微软还没有使用它,我从来没能将它序列化为可互操作的SAML令牌......我不确定SesAM会用它做什么。