C# 基于角色的授权不起作用.NET Core 3.0

C# 基于角色的授权不起作用.NET Core 3.0,c#,asp.net-core,asp.net-core-3.0,asp.net-authorization,asp.net-authentication,C#,Asp.net Core,Asp.net Core 3.0,Asp.net Authorization,Asp.net Authentication,基于角色的授权在我的代码中不起作用,如果我缺少任何内容,请指导我。 我的项目是基于.NETCore3.0框架的 身份验证工作正常,但授权不工作 public class Startup { public Startup(IConfiguration configuration) { Configuration = configuration; } public IConfiguration Configuration { get; }

基于角色的授权在我的代码中不起作用,如果我缺少任何内容,请指导我。 我的项目是基于.NETCore3.0框架的

身份验证工作正常,但授权不工作

public class Startup
{
    public Startup(IConfiguration configuration)
    {
        Configuration = configuration;
    }

    public IConfiguration Configuration { get; }

    public void ConfigureServices(IServiceCollection services)
    {
        services.Configure<CookiePolicyOptions>(options =>
        {
            options.CheckConsentNeeded = context => true;
            options.MinimumSameSitePolicy = SameSiteMode.None;
        });

        services.Configure<CookieTempDataProviderOptions>(options =>
        {
            options.Cookie.IsEssential = true;
        });
        services.AddDbContextPool<ApplicationDbContext>(options =>
            options.UseSqlServer(Configuration.GetConnectionString("DefaultConnection")));

        services.AddIdentity<ApplicationUser, IdentityRole>(config =>
        {
            config.User.RequireUniqueEmail = true;    // ���������� email
            config.User.AllowedUserNameCharacters = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789 -._@+"; 
            config.SignIn.RequireConfirmedEmail = false;
        }).AddEntityFrameworkStores<ApplicationDbContext>()
          .AddClaimsPrincipalFactory<MyUserClaimsPrincipalFactory>()
          .AddDefaultTokenProviders();

        services.AddMvc(config => {
            var policy = new AuthorizationPolicyBuilder()
                            .RequireAuthenticatedUser()
                            .Build();
            config.Filters.Add(new AuthorizeFilter(policy));
        }).AddRazorPagesOptions(options =>
            {
                options.Conventions.AuthorizeFolder("/");

                options.Conventions.AllowAnonymousToPage("/Error");
                options.Conventions.AllowAnonymousToPage("/Account/AccessDenied");
                options.Conventions.AllowAnonymousToPage("/Account/ConfirmEmail");
                options.Conventions.AllowAnonymousToPage("/Account/ExternalLogin");
                options.Conventions.AllowAnonymousToPage("/Account/ForgotPassword");
                options.Conventions.AllowAnonymousToPage("/Account/ForgotPasswordConfirmation");
                options.Conventions.AllowAnonymousToPage("/Account/Lockout");
                options.Conventions.AllowAnonymousToPage("/Account/Login");
                options.Conventions.AllowAnonymousToPage("/Account/LoginWith2fa");
                options.Conventions.AllowAnonymousToPage("/Account/LoginWithRecoveryCode");
                options.Conventions.AllowAnonymousToPage("/Account/Register");
                options.Conventions.AllowAnonymousToPage("/Account/ResetPassword");
                options.Conventions.AllowAnonymousToPage("/Account/ResetPasswordConfirmation");
                options.Conventions.AllowAnonymousToPage("/Account/SignedOut");
            })
            .SetCompatibilityVersion(CompatibilityVersion.Latest);
        
        services.AddControllersWithViews().AddRazorRuntimeCompilation();
        services.Configure<MailManagerOptions>(Configuration.GetSection("Email"));

        if (Configuration["Email:EmailProvider"] == "SendGrid")
        {
            services.Configure<SendGridAuthOptions>(Configuration.GetSection("Email:SendGrid"));
            services.AddSingleton<IMailManager, SendGridMailManager>();
        }
        else
        {
            services.AddSingleton<IMailManager, EmptyMailManager>();
        }

        services.AddScoped<ProfileManager>();

    }

    public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
    {
        if (env.IsDevelopment())
        {
            app.UseDeveloperExceptionPage();
        }
        else
        {
            app.UseExceptionHandler("/Error");
            app.UseHsts();
        }

        app.UseHttpsRedirection();
        app.UseStaticFiles();
        app.UseRouting();
        app.UseAuthentication();
        app.UseAuthorization();

        app.UseEndpoints(endpoints =>
        {
            endpoints.MapRazorPages();
            endpoints.MapControllerRoute(
                name: "default",
                pattern: "{controller=Dashboards}/{action=Index}/{id?}");

        });

    }
}
MyUserClaimsPrincipalFactory代码:

public class MyUserClaimsPrincipalFactory : UserClaimsPrincipalFactory<ApplicationUser>
    {
        private readonly ApplicationDbContext _context;
        public MyUserClaimsPrincipalFactory(UserManager<ApplicationUser> userManager,IOptions<IdentityOptions> optionsAccessor, ApplicationDbContext context)
                : base(userManager, optionsAccessor)
        {
            _context = context;
        }

        protected override async Task<ClaimsIdentity> GenerateClaimsAsync(ApplicationUser user)
        {
            var identity = await base.GenerateClaimsAsync(user);
            return identity;
        }
    }
公共类MyUserClaimsPrincipalFactory:UserClaimsPrincipalFactory
{
私有只读应用程序的bContext\u上下文;
公共MyUserClaimsPrincipalFactory(UserManager UserManager、IOptions选项访问器、ApplicationDbContext上下文)
:base(用户管理器、选项访问器)
{
_上下文=上下文;
}
受保护的覆盖异步任务GenerateClaimsAsync(ApplicationUser用户)
{
var identity=await base.GenerateClaimsAsync(用户);
返回身份;
}
}

您可以发布
MyUserClaimsPrincipalFactory
的代码吗?您正在调用并使用
wait base.GenerateClaimsAsync(用户)
中的
GenerateClaimsAsync(应用程序用户)
的结果吗?您好@JesseJohnson,GenerateClaimsAsync(应用程序用户)正在返回标识,无需任何操作您可以发布
MyUserClaimsPrincipalFactory
的代码吗?您是否正在调用并使用
wait base.GenerateClaimsAsync(用户)
中的
GenerateClaimsAsync(应用程序用户)
?Hi@JesseJohnson,GenerateClaimsAsync(应用程序用户)正在返回标识,无需任何操作
public class MyUserClaimsPrincipalFactory : UserClaimsPrincipalFactory<ApplicationUser>
    {
        private readonly ApplicationDbContext _context;
        public MyUserClaimsPrincipalFactory(UserManager<ApplicationUser> userManager,IOptions<IdentityOptions> optionsAccessor, ApplicationDbContext context)
                : base(userManager, optionsAccessor)
        {
            _context = context;
        }

        protected override async Task<ClaimsIdentity> GenerateClaimsAsync(ApplicationUser user)
        {
            var identity = await base.GenerateClaimsAsync(user);
            return identity;
        }
    }