我有一个使用 ASP.NET Membership 构建的 webforms 应用程序。我已成功迁移到 Identities。
我现在想使用 Claims 授权而不是 Roles 授权,但是旧用户的 Role 信息已经迁移到数据库中的 AspNetUserRoles
表,但是 AspNetUserClaims
表是空的。迁移后注册的新用户,我可以用下面的代码添加到AspNetUserClaims
:
IdentityResult result1 = manager.AddClaim(user.Id, new Claim(ClaimTypes.Role, "role"));
但是老用户只在AspNetUserRoles
表中注册,没有在AspNetUserClaims
表中注册。
在登录时,创建的声明是否会同时包含
AspNetUserRoles
表中的角色信息,或者仅包含AspNetUserClaims
表中的角色信息?
<User.IsInRole()
会检查AspNetUserRoles
表和AspNetUserClaims
表吗?如何将信息从
AspNetUserRoles
表迁移到AspNetUserClaims
表?
最佳答案
不要迷上“声明”一词。这是一种将信息添加到 cookie 中的便捷方法。
这里实际上有两种类型的“声明”——一种添加到 cookie 中,另一种保存在 AspNetUserClaims
中。 table 。
当用户登录时,会创建一个带有标识的 cookie。身份包含用户拥有的所有声明。这里的 Claim 是一个键值对,作为有效负载添加到 cookie 中。 Cookie 声明包含类似 User.Id
的内容, SecurityStamp
, Username
一些其他框架相关的东西和...来自AspNetUserRoles
的角色列表.连同来自 AspNetUserClaims
的额外声明.
因此,您试图将角色添加到声明中的内容毫无意义。无论如何,角色将作为声明存在于 cookie 中 - 由框架添加。
可能我没有解释好 - 当你调试你的应用程序时,分析 User
Controller 的属性并查看 ClaimsIdentity
并查看所有 claim list 。我所有的废话都会更有意义。
回答你的第二个问题 - 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 - 您将更好地理解这一切是如何组合在一起的。
关于c# - 从 Roles 授权更改为 Claims 授权,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41589884/