ASP.NET Core 2.0 无法在 Razor 视图或控制器 [授权] 注释中检查用户是否处于正确的角色中



我正在处理一个具有基于角色的授权的遗留项目,但我遇到了一些问题。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

对于AuthorizeUser.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 以避免大小写不匹配。

相关内容

  • 没有找到相关文章

最新更新