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

Dan*_*Dan 24 .net c# authentication claims-based-identity wif

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

我知道有两大类:

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

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

对我来说,ClaimsPrincipal,除了使用它来获得当前的身份,原谅我的无知,它是无用的.

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

Ali*_*dar 26

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

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

试着这样看.

委托人=用户

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

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

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

  • 这是一个很好的解释。绝对是+1。现在,您是否碰巧以类似的质量和洞察力回答了有关安全设置概念的体系结构(或更确切地说是哲学)的其他问题?我查过周围但并不幸运得到这样的东西。更具体地说,我希望看到关于权利要求、范围、政策和资源之间关系的解释。(注意**不是**定义**也**是常见示例,而是与“现实生活”概念以及一些典型案例的**简短**(隐喻)比较 - 就像您在这里所做的那样)。 (3认同)

Sta*_*ley 15

如上所述,auser的类型claimsprincipal由以下组成claimsidentity

我做了一个图表来更容易解释它:

ClaimsPrincipal、ClaimsIdentity 和索赔可视化图


如果您在索赔方面遇到困难, 我强烈建议您阅读本文https://andrewlock.net/introduction-to-authentication-with-asp-net-core/

编辑:更改图表 在此输入图像描述


Pau*_*her 5

一个重要的安全原则是“谁说”,即我们是否信任针对身份声明主张的一方,因此对于特定的ClaimsPrincipal,我们可能具有不同的身份,每个身份主张的主张都不同,这使我们能够确定应用程序中的总体访问控制,

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

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

因此,现在我们具有Windows所断言的角色(即后台声明)和断言团队或部门的自定义理据的应用程序标识。