ASP.NET 核心 3.1 MVC 访问被拒绝基于角色的授权 - 与自定义 UserClaimsPrincipalFactory 冲突

ASP.NET Core 3.1 MVC Access Denied role based authorization - Conflict with custom UserClaimsPrincipalFactory

我已经在Whosebug上阅读了很多类似问题的答案,但仍然无法弄清楚我做错了什么。

我的 AspNetUsers、AspNetRoles 和 AspNetUserRoles 表已正确设置种子。

这是我的配置服务:

public void ConfigureServices(IServiceCollection services)
    {
        services.AddDbContext<ApplicationDbContext>(options =>
            options.UseLazyLoadingProxies().UseSqlServer(Configuration.GetConnectionString("DefaultConnection")));
        services.AddIdentity<ApplicationUser, IdentityRole>(options => options.SignIn.RequireConfirmedAccount = false)
            .AddRoles<IdentityRole>()
            .AddEntityFrameworkStores<ApplicationDbContext>()
            .AddClaimsPrincipalFactory<CustomUserClaimsPrincipalFactory>();
        services.AddControllersWithViews();
        services.AddMvc();
        services.AddRazorPages();
        services.AddAuthorization(options => {
            options.AddPolicy("ManagerOnly", policy => policy.RequireRole("Manager"));
            options.FallbackPolicy = new AuthorizationPolicyBuilder()
                .RequireAuthenticatedUser()
                .Build();
        });
        services.Configure<IdentityOptions>(options =>
        {
            ...
        });

        services.ConfigureApplicationCookie(options =>
        {
            ...
        });

        services.Configure<PasswordHasherOptions>(option =>
        {
            ...
        });
    }

当我们select“个人用户帐户”作为身份验证方法时,我正在使用Visual Studio脚手架的默认身份管理。

当我放 [Authorize(Policy = "ManagerOnly"] 在任何操作上,即使从具有管理员角色的正确用户帐户登录,我也会收到拒绝访问结果。

编辑:

我已经确认删除 .AddClaimsPrincipalFactory<CustomUserClaimsPrincipalFactory>();

后问题消失了

以下是我的 CustomUserClaimsPrincipalFactory:

public class CustomUserClaimsPrincipalFactory : UserClaimsPrincipalFactory<ApplicationUser>
{
    public CustomUserClaimsPrincipalFactory(
    UserManager<ApplicationUser> userManager, IOptions<IdentityOptions> optionsAccessor) : base(userManager, optionsAccessor)
    {
    }

    protected override async Task<ClaimsIdentity> GenerateClaimsAsync(ApplicationUser user)
    {
        var identity = await base.GenerateClaimsAsync(user);
        identity.AddClaim(new Claim("FullName", user.FullName ?? "Unnamed"));
        return identity;
    }
}

知道为什么这会与角色冲突吗?

编辑 2:

像我这样的菜鸟解决方案:

public class CustomUserClaimsPrincipalFactory : UserClaimsPrincipalFactory<ApplicationUser, IdentityRole>
{
    public CustomUserClaimsPrincipalFactory(
    UserManager<ApplicationUser> userManager, RoleManager<IdentityRole> roleManager, IOptions<IdentityOptions> optionsAccessor) : base(userManager, roleManager, optionsAccessor)
    {
    }

根据我的理解,需要在自定义声明工厂中注入角色管理器,以便在我们覆盖基本声明生成时加载数据库中定义的角色。

我认为您注入到 CustomUserClaimsPrincipalFactory 的依赖项在某种程度上有所不同或未正确解析,因此无法连接到数据库。

请确保在启动时正确设置了角色管理器。