【问题标题】:ASP.NET Core 3.0 Role Based Authorization not workingASP.NET Core 3.0 基于角色的授权不起作用
【发布时间】:2020-02-13 01:55:22
【问题描述】:

我有一个 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 个角色,即。管理员和用户。但是,没有管理员角色的用户帐户可以访问 Index 操作方法。它允许任何经过身份验证的用户访问该页面,而不是将访问限制为拥有正确角色(即管理员角色)的用户。我错过了什么?

【问题讨论】:

  • 如重复问题的答案所述,订单无效,将app.UseRouting()放在app.UseAuthentication()之前。
  • 我不同意。这不是可能的重复,因为其他线程使用 JwtBearerDefaults 而我使用 Identity。我想它们是两种不同的东西。
  • 中间件的重新排序确实有帮助。谢谢。
  • 这就是为什么我将此问题标记为可能重复的原因。问题是一样的,虽然认证的类型不同,所以这里的答案也是有效的。

标签: c# asp.net-core authorization


【解决方案1】:

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

所以我启用了 SSL,现在它工作得很好。如果您遇到类似问题并且重新安排中间件没有帮助,请检查您是否从项目属性页面启用了 SSL。希望这对某人有所帮助。

【讨论】:

  • 如果您单独阅读答案,您可能会觉得难以理解。遵循之前的 cmets,您将了解以前建议和尝试过的内容以及无效的内容。那么阅读这个答案可能是有意义的。
【解决方案2】:

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

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

【讨论】:

  • 感谢您的回答。我添加了这个来看看我是否可以使用策略作为角色的可能替代方案。在我更改中间件顺序后它现在可以工作,但我将策略留在那里。
猜你喜欢
  • 2019-09-29
  • 2021-03-12
  • 2021-09-04
  • 2020-05-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-05-23
  • 2015-10-08
相关资源
最近更新 更多