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

时间:2017-01-11 11:36:15

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

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

我现在想要使用声明授权而不是Roles授权,但旧用户的角色信息已迁移到数据库中的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表格?

1 个答案:

答案 0 :(得分:6)

不要迷上"索赔"术语。这是将信息添加到cookie中的便捷方式。

这里实际上是两种类型的"声明" - 添加到cookie中的一个和保存在AspNetUserClaims表中的一个。

当用户登录时,会创建一个带有身份的cookie。身份包含用户拥有的所有声明。这里声明的是一个键值对,它作为有效负载添加到cookie中。 Cookie声明包含User.IdSecurityStampUsername其他一些与框架相关的内容以及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的内容的说法 - 您将更好地理解它们是如何结合在一起的。