【问题标题】:Add Multiple Identities in ClaimsPrincipal在 ClaimsPrincipal 中添加多个身份
【发布时间】:2014-07-08 18:13:50
【问题描述】:

我看到很多类似下面的代码来创建一个新的 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 中使用多个身份提供建议?

【问题讨论】:

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


【解决方案1】:

有一个构造函数,它会为你做的:

public ClaimsPrincipal(IEnumerable<ClaimsIdentity> identities)

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

【讨论】:

  • 感谢您的回答。是的,我看到了,但不知道如何使用它。我最终做的是直接从令牌中获取身份集合并在该级别添加或删除身份,然后从 ClaimsIdenties 的集合中重新创建 ClaimsPrincipal。像这样:身份 = handler.ValidateToken(token, cookieHandler.Path)。我会在周末用我的问题更新我最终得到的代码。
  • 当您使用 Subject 声明添加多个身份然后尝试从 Principal 检索 Subject 声明时,它可能会令人困惑 - 它应该返回哪个? ClaimsPrincipal 具有默认的主身份,但不确定在多个身份的情况下应该由谁以及如何设置它。
猜你喜欢
  • 2021-03-13
  • 1970-01-01
  • 2021-01-29
  • 2022-01-21
  • 1970-01-01
  • 2020-08-07
  • 1970-01-01
  • 2016-11-14
  • 1970-01-01
相关资源
最近更新 更多