我试图根据应用程序(依赖方)的声明来了解 .NET 背后的安全模型。
我知道有2个主要类别:
问题是,ClaimsPrincipal 仅包含一组身份并指向当前使用的身份,但据我所知,主体通常不会包含超过 1 个身份,即使会包含 - 用户也不会使用 2 个或 2 个身份登录更多身份。
对于我这个ClaimsPrincipal来说,除了用来获取当前身份之外,恕我无知,没什么用。
除了我所说的以及关于 ClaimsPrincipal 类的向后兼容性之外,我还缺少什么?
问题是,ClaimsPrincipal 仅包含一组身份并指向当前使用的身份,但据我所知,主体通常永远不会包含超过 1 个身份,即使会包含 - 用户也永远不会使用 2 个身份登录或更多身份.
这是一个错误的假设。事实上,如果您的应用程序需要 n 因素身份验证 (n > 1),则上下文中的 ClaimsPrincipal 将始终具有超过 1 个身份。
尝试这样看。
主体 = 用户
身份 = 驾照、护照、信用卡、Google 帐户、Facebook 帐户、RSA SecurID、指纹、面部识别等。
如果您被警察拦下,他们不会仅根据您的驾驶执照来验证您的身份。他们还需要看到你的脸。否则你可以出示任何人的驾驶执照。
因此,身份验证可以而且有时应该基于多个身份,这是有道理的。这就是为什么 1 ClaimsPrincipal 可以有任意数量的 ClaimsIdentity。
如上所述,
user
属于 claimsprincipal
类型,由 claimsidentity
组成
我做了一个图表来更容易解释它:
如果您正在为索赔而苦苦挣扎,我会强烈建议您阅读本文 https://andrewlock.net/introduction-to-authentication-with-asp-net-core/
一个重要的安全原则是“谁说的”,即我们是否信任针对该身份提出主张的一方,因此对于特定的 ClaimsPrincipal,我们可能有不同的身份,每个身份都主张一组不同的主张,这使我们能够确定应用程序中的总体访问控制,
让我们以通过 Windows 身份验证进行身份验证的企业应用程序为例,我们还希望根据应用程序数据库中的团队或部门断言一些访问控制。
使用 ClaimsTransformationManager 我们可以统一这两组,即在对用户进行身份验证后,我们可以在数据库中查找用户的团队/部门并创建一组由应用程序发出的声明。
因此,现在我们拥有由 Windows 声明的角色(即幕后声明)以及声明团队或部门的自定义声明的应用程序身份。