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

问题描述 投票:0回答:3

我试图根据应用程序(依赖方)的声明来了解 .NET 背后的安全模型。

我知道有2个主要类别:

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

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

对于我这个ClaimsPrincipal来说,除了用来获取当前身份之外,恕我无知,没什么用。

除了我所说的以及关于 ClaimsPrincipal 类的向后兼容性之外,我还缺少什么?

c# .net authentication wif claims-based-identity
3个回答
137
投票

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

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

尝试这样看。

主体 = 用户

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

如果您被警察拦下,他们不会仅根据您的驾驶执照来验证您的身份。他们还需要看到你的脸。否则你可以出示任何人的驾驶执照。

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


14
投票

如上所述,

user
属于
claimsprincipal
类型,由
claimsidentity

组成

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


如果您正在为索赔而苦苦挣扎,我会强烈建议您阅读本文 https://andrewlock.net/introduction-to-authentication-with-asp-net-core/

编辑:更改图表


8
投票

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

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

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

因此,现在我们拥有由 Windows 声明的角色(即幕后声明)以及声明团队或部门的自定义声明的应用程序身份。

© www.soinside.com 2019 - 2024. All rights reserved.