【问题标题】:ASP.Net Core 6 - Authorize Roles not workingASP.Net Core 6 - Authorize Roles not working
【发布时间】:2023-02-02 00:18:34
【问题描述】:

我已经阅读了无数的教程、文章和问题。

我不明白为什么 [Authorize(Roles = "SuperAdmin")] 或任何其他角色不起作用。无论指定的角色如何,每个人都会收到 403:

//[Authorize(Roles = "SuperAdmin")] - Commented out to debug roles
public async Task<IActionResult> Index()
{
    var userID = User.FindFirstValue(ClaimTypes.NameIdentifier);
    var user = await _userManager.FindByIdAsync(userID);
    var roles = await _userManager.GetRolesAsync(user);

    return View();
}

当我调试用户时,我可以看到他们具有以下角色:

但是他们仍然会在任何授权角色的控制器上得到 403。

以下是我的 program.cs 的相关部分:

builder.Services.AddIdentity<TMSUser, IdentityRole>(options => options.SignIn.RequireConfirmedAccount = true)
    .AddEntityFrameworkStores<ApplicationDbContext>()
    .AddClaimsPrincipalFactory<MyUserClaimsPrincipalFactory>()
    .AddRoleManager<RoleManager<IdentityRole>>()
    .AddTokenProvider<DataProtectorTokenProvider<TMSUser>>(TokenOptions.DefaultProvider);

builder.Services.ConfigureApplicationCookie(options =>
{
    options.AccessDeniedPath = new PathString("/Home/HandleError/401");
    options.LoginPath = new PathString("/Home/Portal");
});

builder.Services.AddAutoMapper(typeof(Program));
builder.Services.AddControllersWithViews();

builder.Services.AddDatabaseDeveloperPageExceptionFilter();
builder.Services.AddControllers().AddNewtonsoftJson(options =>
{
    options.SerializerSettings.ContractResolver = new DefaultContractResolver();
});

builder.Services.AddTransient<IEmailSender, EmailSender>();
builder.Services.AddTransient<ITools, Tools>();

builder.Services.Configure<AuthMessageSenderOptions>(builder.Configuration);

builder.Services.AddMvc(options =>
{
    var policy = new AuthorizationPolicyBuilder()
        .RequireAuthenticatedUser()
        .Build();
    options.Filters.Add(new AuthorizeFilter(policy));
});

var app = builder.Build();

app.UseStatusCodePagesWithReExecute("/Home/HandleError/{0}");
app.UseHsts();

using (var scope = app.Services.CreateScope())
{
    var services = scope.ServiceProvider;

    var context = services.GetRequiredService<TMSContext>();
    context.Database.EnsureCreated();
}

app.UseHttpsRedirection();
app.UseStaticFiles();

app.UseRouting();

app.UseAuthentication();
app.UseAuthorization();

app.MapControllerRoute(
    name: "default",
    pattern: "{controller=Home}/{action=Index}/{id?}");

app.MapRazorPages();

app.Run();

在过去的几个月里,我无数次地修改了我的代码,试图让它工作,但现在我只是在乞求帮助。这非常令人沮丧!我错过了什么?我的代码中的其他内容是否会阻止它正常工作?

谢谢!

【问题讨论】:

  • 检查过超级管理员角色名称的大小写了吗?认为外壳必须相等
  • 是的,外壳匹配。谢谢!

标签: c# asp.net asp.net-core asp.net-core-mvc asp.net-authorization


【解决方案1】:

检查你得到了什么 User.FindAll(ClaimTypes.Role).ToList()

在那之后检查“SuperAdmin”是否出现在列表中?如果您的问题没有解决,请发布您的GetRolesAsync功能。

【讨论】:

    猜你喜欢
    • 2021-01-11
    • 2014-10-08
    • 2019-11-02
    • 2023-03-11
    • 2020-10-28
    • 2022-01-02
    • 2019-05-14
    • 2020-10-02
    • 1970-01-01
    相关资源
    最近更新 更多