身份逻辑概念和误解

时间:2017-05-21 02:33:24

标签: asp.net entity-framework asp.net-core asp.net-identity identity

我发现这说起来相当尴尬,但我无法真正地围绕身份的工作方式,我几乎可以做任何我需要的程序设计,但它只是没有聚集在一起

因此,例如,简而言之,如果我想将某人标记为管理员,我是否应该创建一个名为“#Ad; IsAdmin"

或称为" Admin" ?

或者我应该创建自己的identityuser并包含该属性

甚至覆盖ClaimsPrincipalFactory以将其包含为声明(第三种选择中的属性)

所以我几乎可以用这4种方式做到这一点,但我不明白什么时候做什么,哪个更合适或者打算如何工作

2 个答案:

答案 0 :(得分:1)

如果您需要将某人标记为管理员,则表示您需要保留该状态。保存用户管理状态的最简单方法是向数据库中的用户声明集合添加“角色”声明“admin”(通过使用SQL查询/简单控制台应用程序/或管理界面)。但这不是保持用户管理状态的唯一方法。您可以想象对您的应用程序有意义的持久性机制,并使用第4个选项来创建标识。

然后确定用户是否是运行时的管理员。当用户登录时,他通常会获得附加到用户身份的用户持久声明收集。如果您添加了角色声明,则可以阅读该声明以检查登录用户是否为管理员。如果您依赖于确定用户是否为管理员的其他机制,则应查询这些资源以检查用户是否为admin,并在运行时将相关声明添加到用户声明集合(通常在用户登录时完成)。当通过添加默认和构造的自定义声明来最终确定用户的声明时,将使用包含所有运行时声明的cookie创建会话。然后,Web应用程序将不需要查询用户持久化状态,因为它现在可以通过在后续请求中使用cookie来构造运行时声明集合。

  1. 我应该创建一个名为“IsAdmin”的声明吗? 是的,如果它使您的授权代码更简单。但这种说法不应该坚持下去。它应该在用户根据用户的其他持久属性/声明登录时构建。

  2. 一个名为“Admin”的角色? 是的,这是将用户标记为管理员的最常用方式。该角色可以持久保存到数据库,并使用asp.net标识在运行时读取。

  3. 我应该创建自己的identityuser并包含该属性, 不,您不应该修改身份用户以包含经常更改的属性。

  4. 甚至覆盖ClaimsPrincipalFactory以将其包含为声明(第三个选项中的属性) 如果在创建用户身份之前需要访问其他资源,则可以采用此路由。例如,您已将用户的管理状态保存在您自己的映射表中。

答案 1 :(得分:0)

如果您希望将某个人标记为管理员或任何其他责任,或将来删除该责任,请使用Role更有意义。当然,您可以自定义IdentityUser并添加IsAdmin属性,但看起来更像硬编码,如果想要新的责任,您可以将另一个IsX添加到IdentityUser

声明是名称值对,表示主题是什么,而不是主题可以做什么。例如,您可能拥有由当地驾驶执照颁发机构颁发的驾驶执照。您的驾驶执照上有您的出生日期。在这种情况下,声明名称为DateOfBirth,声明值将是您的出生日期。我在声明中存储了一些类似于UserId的其他信息,而不是从数据库中获取用户以获取UserId