我正在处理一个具有基于角色的授权的遗留项目,但我遇到了一些问题。User.IsInRole("admin")
和[Authorize(Roles = "admin")]
总是无法通过授权。User.IsInRole()
始终返回False
。我很确定该用户已正确添加到角色中。Role name 'admin' is already taken.
User already in role 'admin'.
也许某些服务正在影响另一项服务。
这是我的启动.cs恢复的代码:
public void ConfigureServices(IServiceCollection services){
services.AddDbContext<ApplicationDbContext>(options => options.UseMySql(connetctionString));
services.AddIdentity<ApplicationUser, IdentityRole>()
.AddEntityFrameworkStores<ApplicationDbContext>()
.AddDefaultTokenProviders();
services.AddScoped<IUserClaimsPrincipalFactory<ApplicationUser>, CustomUserClaimsPrincipalFactory>();
services.AddMvc();
services.AddDistributedMemoryCache();
services.AddSession();
}
public void Configure(IApplicationBuilder app, IHostingEnvironment env){
app.UseStaticFiles();
app.UseAuthentication();
app.UseMvc(routes => {...});
}
我错过了什么?
附言。是的,我登录了 ou 并登录。
附言。是,用户具有管理员角色
"管理员"在小写中是正确的
ApplicationDbContext 继承 IdentityDbContext
诗篇2.这是我的数据
SELECT id,username FROM aspnetusers;
|id | username |
|c4f7bf16... | admin@admin.com |
SELECT Id,Name FROM aspnetroles;
|Id | Name |
|50e2a572... | admin |
SELECT * FROM aspnetuserroles;
|UserId | RoleId |
|c4f7bf16... | 50e2a572...|
我有一种感觉,这是因为你的Roles
和你的Claims
在某个地方混淆了。
根据文档,ClaimsPrincipal.IsInRole(( 方法检查类型为ClaimsIdentity.RoleClaimType
的声明。
可以将声明设置为"admin",而该声明不属于声明类型ClaimsIdentity.RoleClaimType
在这种情况下,它将通过身份验证。
在很多错误之后,我终于找到了我所缺少的东西。
我只是在扩展UserClaimsPrincipalFactory<ApplicationUser>
而不是UserClaimsPrincipalFactory<ApplicationUser, IdentityRole>
.
正确扩展角色后,可以声明结束。
public class MyUserClaimsPrincipalFactory : UserClaimsPrincipalFactory<ApplicationUser, IdentityRole>
配置为在身份验证后返回声明中的角色的身份服务器。您可以在控制器中检查声明。
喜欢这个
var claims = User.Claims.ToList();
对于您的问题,还有一种可能,请检查您的角色名称是否为admin
。
对于Authorize
或User.IsInRole
,它是区分大小写的,这意味着如果您的角色名称是Admin
,它将在User.IsInRole("admin")
或[Authorize(Roles = "admin")]
中失败。
对于一种方法 检查它是否admin
,请尝试await _userManager.IsInRoleAsync(user, "user")
:
var user = await _userManager.FindByNameAsync(User.Identity.Name);
var r1 = User.IsInRole("User");
var r2 = User.IsInRole("user");
var r3 = await _userManager.IsInRoleAsync(user, "user");
您可以尝试将role
定义为 const 以避免大小写不匹配。