我有一个使用ASP.NET Membership构建的webforms应用程序。我成功迁移到了身份。
我现在想要使用声明授权而不是Roles授权,但旧用户的角色信息已迁移到数据库中的AspNetUserRoles
表,但AspNetUserClaims
表为空。迁移后注册的新用户,我可以使用以下代码添加到AspNetUserClaims
:
IdentityResult result1 = manager.AddClaim(user.Id, new Claim(ClaimTypes.Role, "role"));
但旧用户只在AspNetUserRoles
表中注册,而不在AspNetUserClaims
表中。
在登录时,创建的声明是否还包括来自AspNetUserRoles
表的角色信息,还是仅来自AspNetUserClaims
表?
User.IsInRole()
是否同时检查AspNetUserRoles
表和AspNetUserClaims
表?
如何将信息从AspNetUserRoles
表格迁移到AspNetUserClaims
表格?
答案 0 :(得分:6)
不要迷上"索赔"术语。这是将信息添加到cookie中的便捷方式。
这里实际上是两种类型的"声明" - 添加到cookie中的一个和保存在AspNetUserClaims
表中的一个。
当用户登录时,会创建一个带有身份的cookie。身份包含用户拥有的所有声明。这里声明的是一个键值对,它作为有效负载添加到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的内容的说法 - 您将更好地理解它们是如何结合在一起的。