代码之家  ›  专栏  ›  技术社区  ›  Daniel Santos

ASP.NET Core 2.0无法在Razor视图或控制器[authorize]批注中检查用户是否正确担任角色

  •  7
  • Daniel Santos  · 技术社区  · 8 年前

    我正在处理一个基于角色授权的遗留项目,但我遇到了一些问题。 User.IsInRole("admin") 和 [Authorize(Roles = "admin")] 总是授权失败。这个 User.IsInRole() False . 我很确定用户被正确地添加到了角色中。 Role name 'admin' is already taken. User already in role 'admin'.

    也许某些服务正在影响另一个。

    下面是我的startup.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。

    是的,用户的角色是admin

    第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...|
    
    6 回复  |  直到 8 年前
        1
  •  2
  •   ste-fu    8 年前

    我觉得这是因为你 Roles 还有你的 Claims 都混在一起了。

    根据 the docs ClaimsIdentity.RoleClaimType

    可以设置“admin”的声明,而不必设置为ClaimType ClaimsIdentity.RoleClaimType类型 在这种情况下,它将无法通过身份验证。

        2
  •  2
  •   Daniel Santos    8 年前

    我只是延长了 UserClaimsPrincipalFactory<ApplicationUser> UserClaimsPrincipalFactory<ApplicationUser, IdentityRole> .

    public class MyUserClaimsPrincipalFactory : UserClaimsPrincipalFactory<ApplicationUser, IdentityRole>
    
        3
  •  1
  •   ArunPratap Miguel    8 年前

    identity server配置为在身份验证后返回声明中的角色。您可以在控制器中检查声明。

    var claims = User.Claims.ToList();
    
        4
  •  1
  •   Edward    8 年前

    您的问题还有一个可能,请检查您的角色名称是否正确 admin

    为了 Authorize User.IsInRole ,它区分大小写,这意味着如果您的角色名 Admin ,它将失败 User.IsInRole("admin") 或 [Authorize(Roles = "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 作为常量以避免大小写不匹配。

        5
  •  -1
  •   Janmejay Kumar    8 年前

    public class ApplicationDbContext: IdentityDbContext<ApplicationUser>