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

时间:2019-10-16 10:02:08

标签: c# asp.net authorization core

我有一个ASP.NET Core 3.0应用程序。我正在使用基于角色的授权。我的Startup.cs看起来像这样。

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

    services.AddAuthentication().AddCookie();
    services.AddAuthorization(options =>
    {
        options.AddPolicy("Admin", authBuilder => { authBuilder.RequireRole("Admin"); });
    });
    services.AddIdentity<SiteUser, IdentityRole>(x =>
    {
        x.Lockout.AllowedForNewUsers = true;
        x.Lockout.DefaultLockoutTimeSpan = TimeSpan.FromMinutes(2);
        x.Lockout.MaxFailedAccessAttempts = 3;
        x.Password.RequireNonAlphanumeric = true;
        x.Password.RequireUppercase = true;
    }).AddEntityFrameworkStores<SiteDbContext>();
    services.AddDbContext<SiteDbContext>(dbContextOptionBuilder =>
        dbContextOptionBuilder.UseLoggerFactory(ConsoleFactory)
            .UseSqlServer(Configuration.GetConnectionString(ConfigurationSettings.LocalDbKeyName)));
}

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

    app.UseHttpsRedirection();
    app.UseStaticFiles();
    app.UseCookiePolicy();
    app.UseForwardedHeaders(new ForwardedHeadersOptions
    {
        ForwardedHeaders = ForwardedHeaders.XForwardedFor | ForwardedHeaders.XForwardedProto
    });
    app.UseAuthentication();
    app.UseAuthorization();
    app.UseRouting();
    app.UseEndpoints(endpoints =>
    {
        endpoints.MapControllerRoute("default", "{controller=Home}/{action=Index}/{id?}");
        endpoints.MapControllers();
    });

在我的Controller类中,我具有适当的Authorize属性,例如

[Authorize(Roles = "Admin")]
public ActionResult Index()
{
    var users= getSomeUsers();
    return View(users);        
}

AspNetRoles表中有2个角色,即。管理员和用户。但是,没有管理员角色的用户帐户可以访问“索引”操作方法。它允许任何经过身份验证的用户访问该页面,而不是将访问权限限制为具有正确角色(即管理员角色)的用户。我想念什么?

2 个答案:

答案 0 :(得分:0)

检查您的用户对象是否具有管理员角色。如果您在授权中使用role属性,则可以从代码中删除此行。

options.AddPolicy("Admin", authBuilder => { authBuilder.RequireRole("Admin"); });

希望这会有所帮助。

答案 1 :(得分:0)

尽管我最初接受了@Ruard van Elburg的回答,但是尽管有     app.UseRouting(); 之前 app.UseAuthorization(); app.UseAuthentication(); 在我的startup.cs文件中的Configure方法中。 因此,我开始了一个新项目并添加了相同的文件,令我惊讶的是,它成功了。比较两个项目中的每个设置后,我发现我关闭了“启用SSL”。

因此我启用了SSL,现在它可以正常工作了。如果您遇到类似的问题,并且重新安排中间件也无济于事,请从项目属性页面检查是否启用了SSL。希望这对某人有帮助。