从 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.
登录时,创建的声明是否会同时包含来自 AspNetUserRoles
table 的角色信息,或者仅包含来自 AspNetUserClaims
table 的角色信息?
User.IsInRole()
会检查AspNetUserRoles
table和AspNetUserClaims
table吗?
如何将信息从 AspNetUserRoles
table 迁移到 AspNetUserClaims
table?
不要迷上 "claims" 术语。这是一种将信息添加到 cookie 中的便捷方法。
这里实际上有 2 种 "claims" - 一种添加到 cookie 中,另一种保存在 AspNetUserClaims
table 中。
当用户登录时,会创建一个带有标识的 cookie。身份包含用户拥有的所有声明。这里声明的是一个 key-value 对,作为有效负载添加到 cookie 中。 Cookie 声明包含 User.Id
、SecurityStamp
、Username
等一些其他与框架相关的内容以及...来自 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 - 您会更好地理解它们是如何组合在一起的。
我有一个使用 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.
登录时,创建的声明是否会同时包含来自
AspNetUserRoles
table 的角色信息,或者仅包含来自AspNetUserClaims
table 的角色信息?User.IsInRole()
会检查AspNetUserRoles
table和AspNetUserClaims
table吗?如何将信息从
AspNetUserRoles
table 迁移到AspNetUserClaims
table?
不要迷上 "claims" 术语。这是一种将信息添加到 cookie 中的便捷方法。
这里实际上有 2 种 "claims" - 一种添加到 cookie 中,另一种保存在 AspNetUserClaims
table 中。
当用户登录时,会创建一个带有标识的 cookie。身份包含用户拥有的所有声明。这里声明的是一个 key-value 对,作为有效负载添加到 cookie 中。 Cookie 声明包含 User.Id
、SecurityStamp
、Username
等一些其他与框架相关的内容以及...来自 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 - 您会更好地理解它们是如何组合在一起的。