Lou*_*ton 5 c# authentication asp.net-mvc claims-based-identity wif
我看到很多类似下面的代码来创建新的 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);
Run Code Online (Sandbox Code Playgroud)
这很简单,网上有很多关于如何执行此操作的示例。我想做但没有找到太多关于如何在 ClaimsPrincipal 中拥有多个身份的文档。ClaimsPrincipal 的定义如下,很明显它支持多个身份。
public class ClaimsPrincipal : IPrincipal
{
public virtual IEnumerable<ClaimsIdentity> Identities { get; }
...
}
Run Code Online (Sandbox Code Playgroud)
我认为上述声明 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);
}
Run Code Online (Sandbox Code Playgroud)
我走在正确的轨道上吗?任何人都可以深入了解当 ClaimsPrincipal 中存在多个身份时,幕后发生的情况,如果我没有走上正确的轨道,您能否就如何在 ClaimsPrincipal 中使用多个身份提供建议?
有一个构造函数可以为您完成此操作:
public ClaimsPrincipal(IEnumerable<ClaimsIdentity> identities)
Run Code Online (Sandbox Code Playgroud)
然而,其语义是未定义的。微软到目前为止还没有使用过它,我也从来没有能够将它序列化为可互操作的 SAML 令牌……我不确定 SesAM 会用它做什么。