从 Roles 授权更改为 Claims 授权

Change from Roles authorization to Claims authorization

我有一个使用 ASP.NET 成员资格构建的 Web 表单应用程序。我已成功迁移到 Identities。

我现在想使用Claims授权而不是Roles授权,但是旧用户的Role信息已经迁移到数据库中的AspNetUserRoles table但是AspNetUserClaims table 为空。迁移后注册的新用户,我可以添加到AspNetUserClaims,代码如下:

IdentityResult result1 = manager.AddClaim(user.Id, new Claim(ClaimTypes.Role, "role"));

但是老用户只注册在AspNetUserRoles table 没有在AspNetUserClaims table.

  1. 登录时,创建的声明是否会同时包含来自 AspNetUserRoles table 的角色信息,或者仅包含来自 AspNetUserClaims table 的角色信息?

  2. User.IsInRole()会检查AspNetUserRolestable和AspNetUserClaimstable吗?

  3. 如何将信息从 AspNetUserRoles table 迁移到 AspNetUserClaims table?

不要迷上 "claims" 术语。这是一种将信息添加到 cookie 中的便捷方法。

这里实际上有 2 种 "claims" - 一种添加到 cookie 中,另一种保存在 AspNetUserClaims table 中。

当用户登录时,会创建一个带有标识的 cookie。身份包含用户拥有的所有声明。这里声明的是一个 key-value 对,作为有效负载添加到 cookie 中。 Cookie 声明包含 User.IdSecurityStampUsername 等一些其他与框架相关的内容以及...来自 AspNetUserRoles 的角色列表。连同来自 AspNetUserClaims.

的额外声明

因此,您试图将角色添加到声明中的内容毫无意义。无论如何,角色将作为声明存在于 cookie 中 - 由框架添加。

可能我没有解释清楚 - 当您调试应用程序时,分析控制器的 User 属性 并查看 ClaimsIdentity 并查看所有声明的列表。我所有的废话都会更有意义。

回答你的第二个问题 - User.IsInRole() 没有进入数据库。此方法仅检查 cookie 中的信息,请参阅 source code for yourself:它仅检查 cookie 是否包含类型为 ClaimTypes.Role 的声明以及您要检查的角色的名称。

第三个问题……你还想做吗?您可以执行 SQL 语句,例如 insert into aspnetuserclaims (<columns>) select <columns> from aspnetUserRoles inner join aspnetroles on aspnetUserRoles.roleid = aspnetroles.id.

我写过 cookie 中包含哪些声明 in my blog a while ago - 您会更好地理解它们是如何组合在一起的。