ClaimsPrincipal的作用是什么,为什么它有多个身份?

时间:2015-09-15 10:47:00

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

我正在尝试基于对应用程序(依赖方)的声明来理解.NET背后的安全模型。

我知道有两大类:

  • ClaimsPrincipal - 正在运行的进程的安全上下文
  • IdentityPrincipal - 存储有关用户的信息 - 身份验证状态和声明

问题是,ClaimsPrincipal只包含一组身份并指向当前使用的身份,但据我所知,主体通常永远不会包含多于1个身份,即使它会 - 但用户从未登录过2个或更多身份。

对我而言,ClaimsPrincipal,除了用它来获取当前的身份,原谅我的无知,这是无用的。

除了我所陈述的内容之外我还缺少什么,让我们说一下与ClaimsPrincipal类相关的兼容性?

3 个答案:

答案 0 :(得分:15)

  

问题是,ClaimsPrincipal只包含一组身份和指向当前使用的身份,但据我所知,主体通常永远不会包含多于1个身份,即使它会 - 但用户永远不会使用2个或更多身份登录

这是一个错误的假设。实际上,如果您的应用程序需要n因子身份验证(n> 1),则上下文中的ClaimsPrincipal将始终具有多于1个身份。

尝试以这种方式看待它。

校长=用户

身份=驾驶执照,护照,信用卡,Google帐户,Facebook帐户,RSA SecurID,指纹,面部识别等

如果您被警察拉过来,他们不会根据您的驾驶执照单独验证您是谁。他们还需要看到你的脸。否则你可以显示任何驾驶执照。

因此,有意义的是,为什么身份验证可以并且有时应该基于多个身份。这就是为什么1 ClaimsPrincipal可以拥有任意数量的ClaimsIdentity。

答案 1 :(得分:4)

一个重要的安全原则是“谁说”,即我们是否信任声称对身份提出索赔的一方,因此对于特定的声明原则,我们可能有不同的身份,每个身份都声称一组不同的声明,允许我们确定应用程序中的overrall访问控制,

我们以一个企业应用程序为例,该应用程序通过Windows身份验证进行身份验证,我们还希望根据应用程序数据库中的团队或部门声明一些访问控制。

使用ClaimsTransformationManager,我们可以统一这两个集合,即在对用户进行身份验证之后,我们可以在数据库中查找用户的团队/部门,并创建一组由应用程序发出的声明。

因此,现在我们拥有Windows所声称的角色(声称是引擎盖下的声明)以及声明团队或部门的自定义声明的应用程序标识。

答案 2 :(得分:2)

如上所述, user claimsprincipal 类型,由 claimsidentity

我制作了一个图表以使其更容易解释:

enter image description here


如果您在声明中苦苦挣扎,我会高度建议您阅读 https://andrewlock.net/introduction-to-authentication-with-asp-net-core/