使用AspNetUserClaims还是AspNetRoleClaims来管理Asp.net Core Identity?

32

我仍然对身份验证的所有内容感到困惑。

首先,我还是不清楚角色、策略/声明之间的区别。从我所了解的来看,角色是旧的做事方式,为了向后兼容而保留下来的,那么AspNetRoleClaims是否也属于这种向后兼容性呢?

我认为当我单独考虑声明和策略时,我能明白它们的含义,比如说策略基本上是必须通过的一组规则,并且可以更改规则而无需在整个代码中更改角色。

声明指的是一个可信任的来源,关于用户已经过证实的信息(例如他们的年龄,可能来自政府来源)。

现在让我感到困惑的是将所有这些东西放在一起。

我生成了身份验证表并查看了其中的内容。

AspNetUsers
AspNetUserRoles
AspNetRoles
AspNetRoleClaims
AspNetUserClaims
AspNetUserLogins

我理解AspNetUsers表的作用和AspNetUserLogins(似乎是用于外部登录提供者)的用途。

我混淆了AspNetRoleClaims和AspNetUserClaims之间的区别。我只使用AspNetUserClaims,还是全部都要用?

假设有这种情况:

我有一个公司,有很多分支机构,在每个分支机构中会有该分支机构的管理员,他们对该分支机构拥有完全权限,但对其他分支机构没有任何权限。在公司级别上,将有一个管理员可以在公司级别和任何分支机构中执行任何操作。最后,我在分支机构中有一个人只能添加新员工。

所有这一切看起来像什么?我需要创建3个角色吗?

CompanyAdmin
BranchAdmin
AddUsersAtBranchLevel (or is this some sort of claim??)
What do the tables look like? Is there anything going to be in AspNetRoleClaims? AspNetUserClaims?

现在我可以制定一个策略来检查用户是否是分支管理员,以及他们是否正试图编辑其分支吗?

还是我应该忘记所有的角色设置,直接使用AspNetUserClaims?

User1   CanAddUserToBranch true
User1 CanDeleteUserBranch true
User1 CanAddUserToCompany true

在我的代码中,将这些所有的"ClaimTypes"都变为不同的,并创建一个策略来检查他们是否具有"CanAddUserToBranch",然后再创建另一个声明或策略来检查他们所在的部门,以确保他们正在尝试将内容添加到正确的部门?

编辑

你认为我需要使用基于资源的授权吗?


4
当你说“我仍对所有这些身份问题感到困惑”时,你已经赢得了我的支持。但你的问题很完美。正如你所说,根据几个可靠的来源,我们不再应该使用角色(简单来说,有2.1个关于角色的漏洞)。然而,在下面唯一的当前答案中,建议仍然使用角色。大多数像你这样的问题在SO上要么无人回答,要么再次使用角色,要么使用旧版本的Identity/Core等......或者脚手架出身份并对其进行自定义。我整天观看msdn等视频,阅读文章和博客,答案仍然不清楚。 - Sum None
@SumNone,我很感激您提到的可信来源链接...如果使用角色可以完成工作,那么没有任何问题。角色是声明。您还可以使用IdentityCore,在AspNetUserClaims表中创建自己的角色声明。选择最好解决问题的方法!(请分享链接,因为我没有听说过不应该使用角色的建议。) - galdin
1
问题在于,如果您不理解其中一种解决方案,很难选择哪个是最好的解决方案。经过多次研究,我有点放弃了,只是使用了“角色”(没有角色声明或任何声明)。所需的要求允许我只使用角色,所以我很幸运。我发现和SunNone一样的情况,每个人都建议不要使用角色(只是在核心书籍中读到),但没有人真正详细说明如何使用它们,如果他们这样做,那么场景非常有限,当我尝试将其应用于我的应用程序时,我很快遇到了问题。 - chobo2
1
这是一个链接,里面Rick Anderson从他们旧的代码示例中提取了我的问题并将其作为工作项。当最新版本的Identity发布时(那时我想是2.1),角色基本上已被弃用。还有一些“Channel 9”视频(如果我没记错的话)与blowdart一起发布,他在其中明确表示了这一点。这里还有另一个相关链接:https://github.com/aspnet/Identity/issues/1813 如果你在六月份问我,我可能会更准确地告诉你blowdart在视频中说了什么。 - Sum None
@gldraphael 请看一下我的上一个评论(我忘了回复你)。另外:https://channel9.msdn.com/Blogs/Seth-Juarez/ASPNET-Core-Authorization-with-Barry-Dorrans 这是 blowdart 视频... 总体来说很棒,但是从第34分钟开始观看可以听到有关角色的内容。还有第二个视频。总的来说,我和你想法一致。你在对已经信奉同样理念的人讲道。 :) 但是,在启动新项目时,我会尽量遵循最新的标准等等。 - Sum None
@SumNone,感谢您提供视频链接。我想我会在周末开一个问题来询问这个问题...据我所知,角色并不是不推荐的。他们只是试图简化事情,让您选择不需要的内容。问题#1813涉及使用AddDefaultIdentity()的模板,该模板使用IdentityCore而不是整个内容。 - galdin
1个回答

48
+------------------+------------------+
|      Table       |   Description    |
+------------------+------------------+
| AspNetUsers      | The users.       |
| AspNetRoles      | The roles.       |
| AspNetUserRoles  | Roles of users.  |
| AspNetUserClaims | Claims by users. |
| AspNetRoleClaims | Claims by roles. |
+------------------+------------------+
  • 角色是指分配给用户的一些职责。
    • 例如:Jane是管理员。
  • 声明是用户声明的一些内容。
    • 例如:Jane的出生日期是1990-10-1。
  • 角色声明是角色声明的一些内容。
    • 例如:管理员可以访问仪表板。

如果你觉得角色和声明很难理解,可能是因为角色是声明的一种特殊情况,即角色本身也是声明。

角色与策略

  • 对于基于角色的授权,授权系统会检查用户是否被分配了访问给定资源所需的角色。

    • 例如:只有具有管理员角色的用户才能访问仪表板。
  • 对于基于策略的授权,会执行一些业务逻辑来决定是否应该授权访问资源。

    • 例如:只有年龄在40岁以上的管理员才能访问财务数据。

假设我有这样的场景

我有一个公司,有很多分支机构,在每个分支机构中都有一个管理员,他们拥有该分支机构的全部权限,但不能在其他分支机构中进行任何操作。在公司级别上,将有一个管理员,可以在公司级别和任何分支机构中执行任何操作。最后,我在分支机构中有一个人只能添加新员工。

以下是一种实现方式:

2个角色:AdminTheRoleThatCanAddUsers
一项声明称为Branch,可以接受分支机构ID(或其他任何用于标识分支机构的信息)。公司管理员可以使用类似"CompanyWide"0-1的值。

现在创建一个策略,检查角色和分支声明,并决定用户是否应该被授权。


1
@chobo2 没有,我在这里没有使用角色声明。当声明附加到角色而不是用户时,角色声明才有意义。此外,根据需要,您可以同时使用它们。 - galdin
1
对,分支的想法很有道理,但是为什么你选择创建角色,而不是创建一堆声明呢?比如在你的模型中,你需要添加TheRoleTheCanEditUser、TheRoleThatCanDeleteUsers。或者放弃这种灵活性,如果所有东西都是声明,你就不会遇到这个问题了。 - chobo2
2
这个YouTube教程展示了如何同时使用声明和角色:https://www.youtube.com/watch?v=LJQBBvJ6tL0 - Eli
微软在这里提供了一个“混合策略和角色”的示例:https://learn.microsoft.com/en-us/aspnet/core/security/authorization/roles?view=aspnetcore-6.0#policy-based-role-checks,这让人感到困惑吗? - granadaCoder
@granadaCoder - 如果你把角色看作是声明类型,那么这就不是问题了。在上面的例子中,“Jane是管理员”可以理解为“Jane声称自己是管理员”。请参考此处有关角色的参考链接 [https://www.iana.org/assignments/jwt/jwt.xhtml] 以获取更多信息。 - galdin
显示剩余9条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接