我有一个使用 ASP.NET 会员资格构建的网络表单应用程序。我已成功迁移到标识。
我现在想要使用声明授权而不是角色授权,但旧用户的角色信息已迁移到数据库中的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 中的便捷方法。
这里实际上是 2 种类型的"声明"——一种添加到 cookie 中,另一种保存在表中AspNetUserClaims
。
当用户登录时,将创建一个具有身份的 Cookie。标识包含用户拥有的所有声明。此处的声明是作为有效负载添加到 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中的声明 - 您将更好地了解它们是如何组合在一起的。