c# - 从 Roles 授权更改为 Claims 授权

标签 c# authorization asp.net-identity roles claims

我有一个使用 ASP.NET Membership 构建的 webforms 应用程序。我已成功迁移到 Identities。

我现在想使用 Claims 授权而不是 Roles 授权,但是旧用户的 Role 信息已经迁移到数据库中的 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 中的便捷方法。

这里实际上有两种类型的“声明”——一种添加到 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/

相关文章:

c# - ASP Crystal Report 报表没有表格

c# outlook 插件 - 在本地存储数据

c# - LINQ 中不同版本的 Intersect()

mysql - 如何在 AngularJS 中处理基于角色的授权?

java - 我应该如何在 Java 的应用程序层之间传递主题/主体/角色?

c# - SmtpClient.SendMailAsync 在抛出特定异常时导致死锁

c# - 如何将二进制图像从桌面应用程序发布到 ashx 处理程序并接收它?

node.js - Node js请求的授权问题

mysql - 使用 EF Core 创建 MySql 数据库

c# - 更改身份数据库