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

Dov*_*ler 1 c# authorization roles claims asp.net-identity

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

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

IdentityResult result1 = manager.AddClaim(user.Id, new Claim(ClaimTypes.Role, "role"));
Run Code Online (Sandbox Code Playgroud)

但旧用户只在AspNetUserRoles表中注册而不在AspNetUserClaims表中.

  1. 在登录时,创建的声明是否也包括AspNetUserRoles表格中的角色信息,还是仅包括表格中的角色信息AspNetUserClaims

  2. 请问User.IsInRole()同时检查AspNetUserRoles表和AspNetUserClaims表?

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

tra*_*max 6

不要迷上"索赔"一词.这是将信息添加到cookie中的便捷方式.

这里实际上有两种类型的"声明" - 一种被添加到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声称的内容- 你会更好地理解它是如何结合在一起的.