Атрибуты роли / политики авторизации не работают в .Net Core 3 - PullRequest
1 голос
/ 14 октября 2019

Мне не повезло, когда в .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 
{
    ...

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

var claims = new List<Claim>();

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

context.IssuedClaims.AddRange(claims);

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

enter image description here

Другие части служб конфигурации:

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

...

services.AddAuthentication()
    .AddIdentityServerJwt();

Простой тег [Authorize] работает нормально, если токен доступа включендругие контроллеры.

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

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

1 Ответ

2 голосов
/ 15 октября 2019

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

enter image description here

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

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

Демо

enter image description here

...