我有一个使用 ASP.NET 会员资格构建的 Web 表单应用程序。我成功迁移到身份。
我现在想使用Claims授权而不是Roles授权,但是老用户的Role信息已经迁移到了AspNetUserRoles
数据库中的表,但AspNetUserClaims
表是空的。迁移后注册的新用户,我可以添加到AspNetUserClaims
使用以下代码:
IdentityResult result1 = manager.AddClaim(user.Id, new Claim(ClaimTypes.Role, "role"));
但老用户只在AspNetUserRoles
表不在AspNetUserClaims
table.
登录时创建的声明将包含来自AspNetUserRoles
表也或仅来自AspNetUserClaims
table?
会不会User.IsInRole()
检查两个AspNetUserRoles
表和AspNetUserClaims
table?
我怎样才能从AspNetUserRoles
表到AspNetUserClaims
table?
不要迷恋“索赔”一词。这是向 cookie 添加信息的便捷方法。
这里实际上有两种类型的“声明”——一种添加到 cookie 中,另一种保留在AspNetUserClaims
table.
当用户登录时,会创建一个具有身份的 cookie。身份包含用户拥有的所有声明。这里的 Claim 是作为有效负载添加到 cookie 中的键值对。 Cookie 声明包含以下内容User.Id
, SecurityStamp
, Username
一些其他与框架相关的东西和......来自的角色列表AspNetUserRoles
。连同其他索赔AspNetUserClaims
.
因此,您试图将角色添加到声明中的内容是没有意义的。无论如何,角色将作为声明存在于 cookie 中 - 由框架添加。
可能我解释得不好 - 当你调试你的应用程序时,分析User
控制器的属性并查看ClaimsIdentity
并查看所有索赔的列表。我所有的胡言乱语都会变得更有意义。
回答你的第二个问题——User.IsInRole()
不进入数据库。该方法只检查cookie中的信息,参见自己的源代码:它只检查 cookie 是否包含声明类型ClaimTypes.Role
与您要检查的角色的名称。
第三个问题...你还想这样做吗?您可以执行 SQL 语句,例如insert into aspnetuserclaims (<columns>) select <columns> from aspnetUserRoles inner join aspnetroles on aspnetUserRoles.roleid = aspnetroles.id
.
我写了关于 cookie 中包含哪些声明的内容不久前在我的博客中- 您将更好地理解这一切是如何结合在一起的。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)