Я новичок в .NET Core, и я пытаюсь настроить авторизацию на основе ролей в проекте .NET Core 3.1. Я считаю, что щелкал по всем обучающим материалам и темам, рассказывающим об этом в Интернете. Моя проблема в том, что, похоже, он очень легко работает с учебниками, но у меня это не работает. Согласно найденным мною руководствам, все, что мне нужно было сделать, это назначить роль пользователю в базе данных, а затем использовать [Authorize(Roles="roleName")]
перед действием контроллера. Когда я это делаю, я всегда получаю ошибку 403 для пользователя с указанной ролью. Когда я использую userManager.GetRolesAsync(user)
, я вижу, что у пользователя есть роль. Когда я делаю запрос на это действие с помощью [Авторизовать], оно работает, когда пользователь вошел в систему, как и ожидалось.
Я проверил в режиме отладки ClaimsPrincipal.Identity для текущего пользователя и обнаружил, что RoleClaimType = "role"
. Я проверил заявки текущего пользователя и обнаружил, что у него нет заявки с типом «роль». Это как [Authorize(Roles="...")]
работает? Это похоже на претензии? Если да, то как я могу претендовать на роль пользователя? Единственный способ для пользователя войти в это приложение - использовать учетную запись 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");
}
});
}
Вот пример действия контроллера
[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")], я вижу, что текущий пользователь имеет роль Admin, но когда я добавляю его, я получаю ошибку 403.
Что я делаю неправильно? Мне кажется, что я где-то упускаю одну строчку или что-то в этом роде, потому что в найденных мною уроках все кажется таким простым.