Атрибуты роли/политики авторизации не работают в .Net Core 3

Мне не повезло получить какие-либо атрибуты роли или политики, работающие в .Net Core 3. Я начал свой проект с начального проекта .Net Core Angular с аутентификацией. Я подумал, что это как-то связано с новыми методами .AddDefault, поэтому я максимально упростил их, но они все равно не работают.

Вот моя политика:

services.AddAuthorization(options =>
{
    options.AddPolicy("IsAdmin", policy =>
        policy.RequireClaim("role", "admin"));
});

Вот мой контроллер:

[Authorize(Policy = "IsAdmin")]
[Route("api/[controller]")]
public class AdminController : Controller 
{
    ...

Я создал собственную службу профилей, которая добавляет требование к токену,

var claims = new List<Claim>();

if (await _userManager.IsInRoleAsync(user, "Admin"))
{
    claims.Add(new Claim(JwtClaimTypes.Role, "admin"));
}

context.IssuedClaims.AddRange(claims);

Внутри моего токена доступа (из jwt.io):

введите описание изображения здесь

Другие части настройки сервисов:

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

...

services.AddAuthentication()
    .AddIdentityServerJwt();

Простой тег [Authorize] отлично работает с токеном доступа на других контроллерах.

Когда я нажимаю на этот контроллер токеном доступа, я получаю ответ 403

Что мне не хватает, что мешает этому работать?


person levitatejay    schedule 14.10.2019    source источник


Ответы (1)


Я пробую ваш код и обнаруживаю, что ключ утверждения role был преобразован в стандартная роль ClaimsType : http://schemas.microsoft.com/ws/2008/06/identity/claims/role

введите описание изображения здесь

Таким образом, использование ClaimTypes.Role решит проблему:

services.AddAuthorization(options => { 
    options.AddPolicy("IsAdmin", policy => 
    { 
        policy.RequireClaim(ClaimTypes.Role,"admin");
    }); 
});

Демо

введите описание изображения здесь

person itminus    schedule 15.10.2019
comment
Вы правы, спасибо за помощь! У вас есть идеи, почему policy.RequireRole("admin") не работает, а policy.RequireClaim(ClaimTypes.Role, "admin") работает? - person levitatejay; 15.10.2019
comment
@levitatejay Насколько я знаю, http://schemas.microsoft.com/ws/2008/06/identity/claims/role — это стандартный способ в ядре dotnet. Однако, хотя преобразование отображает роль для нас, оно не изменяет внутреннее поле _roleClaimType в то же время, что делает User.IsInRole() недоступным, поэтому ваш policy.RequireRole("admin") не работает. - person itminus; 15.10.2019
comment
@itminus Спасибо! Есть ли способ исправить это, чтобы RequireRole (admin) работал? - person bacr; 06.11.2019
comment
См. здесь: github.com/aspnet/AspNetCore.Docs/issues/14944 - person levitatejay; 15.01.2020