从"角色授权"更改为"声明授权"



我有一个使用 ASP.NET 会员资格构建的网络表单应用程序。我已成功迁移到标识。

我现在想要使用声明授权而不是角色授权,但旧用户的角色信息已迁移到数据库中的AspNetUserRoles表,但AspNetUserClaims表为空。迁移后注册的新用户,我可以使用以下代码添加到AspNetUserClaims

IdentityResult result1 = manager.AddClaim(user.Id, new Claim(ClaimTypes.Role, "role"));

但旧用户仅在AspNetUserRoles表中注册,而不是在AspNetUserClaims表中注册。

  1. 登录时,创建的声明是也包含来自AspNetUserRoles表的角色信息,还是仅包含来自AspNetUserClaims表的角色信息?

  2. User.IsInRole()会同时检查AspNetUserRoles表和AspNetUserClaims表吗?

  3. 如何将信息从AspNetUserRoles表迁移到AspNetUserClaims表?

不要迷上"声明"一词。在这里,这是将信息添加到 cookie 中的便捷方法。

这里实际上是 2 种类型的"声明"——一种添加到 cookie 中,另一种保存在表中AspNetUserClaims

当用户登录时,将创建一个具有身份的 Cookie。标识包含用户拥有的所有声明。此处的声明是作为有效负载添加到 cookie 中的键值对。Cookie 声明包含诸如User.IdSecurityStampUsername一些其他与框架相关的东西和......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中的声明 - 您将更好地了解它们是如何组合在一起的。

相关内容

  • 没有找到相关文章

最新更新