gpt4 book ai didi

c# - ASP.NET Core 3.1 中基于角色的授权,带有 Identity 和 ExternalLogin

转载 作者:行者123 更新时间:2023-12-04 09:43:41 25 4
gpt4 key购买 nike

我是 .NET Core 的新手,我正在尝试在 .NET Core 3.1 项目中设置基于角色的授权。我相信我点击了在线讨论它的每个教程和线程。我的问题是它似乎在教程中很容易工作,但对我不起作用。根据我发现的教程,我所要做的就是为数据库中的用户分配一个角色,然后使用 [Authorize(Roles="roleName")]在 Controller 的操作之前。当我这样做时,对于具有指定角色的用户,我总是收到 403 错误。当我使用 userManager.GetRolesAsync(user) ,我看到用户有这个角色。当我使用 [Authorize] 请求此操作时,它会在用户登录时按预期工作。

我检查了当前用户的 Debug模式 ClaimsPrincipal.Identity,我发现 RoleClaimType = "role" .我检查了当前用户的声明,发现它没有类型为“角色”的声明。是这样吗[Authorize(Roles="...")]作品?它看起来像 claim 吗?如果是这样,我如何声明用户的角色?用户登录此应用程序的唯一方法是使用 Google 帐户。那么,如果声明是由 Google 登录名管理的,我应该如何添加声明?

这是我在 Startup.cs 中的代码

public void ConfigureServices(IServiceCollection services)
{
services.AddDbContext<ApplicationDbContext>(options =>
options.UseNpgsql(Configuration.GetConnectionString("DefaultConnection")));

services.AddDefaultIdentity<ApplicationUser>()
.AddRoles<ApplicationRole>()
.AddEntityFrameworkStores<ApplicationDbContext>();

services.AddIdentityServer()
.AddApiAuthorization<ApplicationUser, ApplicationDbContext>();

services.AddAuthentication()
.AddGoogle(options =>
{
IConfigurationSection googleAuthNSection =
Configuration.GetSection("Authentication:Google");

options.ClientId = googleAuthNSection["ClientId"];
options.ClientSecret = googleAuthNSection["ClientSecret"];
})
.AddIdentityServerJwt();

services.AddControllersWithViews();
services.AddRazorPages();
services.AddSpaStaticFiles(configuration =>
{
configuration.RootPath = "ClientApp/dist";
});
}

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

app.UseHttpsRedirection();
app.UseStaticFiles();
if (!env.IsDevelopment())
{
app.UseSpaStaticFiles();
}
app.UseRouting();
app.UseIdentityServer();
app.UseAuthorization();
app.UseEndpoints(endpoints =>
{
endpoints.MapControllerRoute(
name: "default",
pattern: "{controller}/{action=Index}/{id?}");
endpoints.MapRazorPages();
});

app.UseSpa(spa =>
{
spa.Options.SourcePath = "ClientApp";

if (env.IsDevelopment())
{
spa.UseAngularCliServer(npmScript: "start");
}
});
}

这是 Controller 操作的示例
[Authorize(Roles = "Admin")]
[HttpGet("userinformations")]
public async Task<UserInformations> GetCurrentUserInformations()
{
string strUserId = this.User.FindFirstValue(ClaimTypes.NameIdentifier);

ApplicationUser user = await userManager.FindByIdAsync(strUserId);

string[] roles = (await userManager.GetRolesAsync(user)).ToArray();

UserInformations userInfo = new UserInformations()
{
UserName = user.UserName,
FirstName = user.FirstName,
LastName = user.LastName,
Email = user.Email,
Organization = user.idDefaultOrganisation.HasValue ? user.DefaultOrganization.OrganizationName : "",
Claims = this.User.Claims.Select(c => $"{c.Type} : {c.Value}").ToArray(),
Roles = roles
};

return userInfo;
}

当我在没有 [Authorize(Roles = "Admin")] 的情况下向这个 Action 发出请求时,我可以看到当前用户具有角色 Admin,但是当我添加它时,我收到了 403 错误。

我究竟做错了什么?我觉得我在某处或类似的地方遗漏了一行,因为在我找到的教程中这一切看起来都很简单。

最佳答案

当您指定 [Authorize(Roles = "<role>")] 时,您的假设是正确的属性,ASP 将创建一个 RolesAuthorizationRequirement幕后。

然后授权处理程序将调用 this.HttpContext.User.IsInRole(<role>)来评估政策。

在你的情况下,电话是 this.HttpContext.User.IsInRole("Admin")
方法User.IsInRole将调查名为 "http://schemas.microsoft.com/ws/2008/06/identity/claims/role" 的 claim 并将其值与“管理员”进行比较

ASP 授权管道未连接到您的 UserManager 逻辑,基本 API 只会观察和验证 JWT token 声明。

您可能应该创建自己的 AuthorizationHandler 来检查用户是否确实是管理员

或者使用 RequireAssertion 的不太正式的方法:

services.AddAuthorization(options => options.AddPolicy("Admininstrators", builder =>
{
builder.RequireAssertion(async context =>
{
string strUserId = context.User.FindFirstValue(ClaimTypes.NameIdentifier);
var user = await userManager.FindByIdAsync(strUserId);
string[] roles = (await userManager.GetRolesAsync(user)).ToArray();
return roles.Contains("Admin");
};
});

[Authorize("Admininstrators")]
[HttpGet("userinformations")]
public async Task<UserInformations> GetCurrentUserInformations()
{
...
}

关于c# - ASP.NET Core 3.1 中基于角色的授权,带有 Identity 和 ExternalLogin,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62216973/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com