Я отправляю JWT на свою конечную точку, используя заголовок Authorization со значением Bearer <encoded jwt>. Вот полезная нагрузка JWT:
{
"sub": "1",
"email": "[email protected]",
"jti": "4dabc47a-c524-4f23-b271-420235822d3d",
"role": "admin",
"exp": 1682255987,
"iss": "http://localhost:5000",
"aud": "http://localhost:5000"
}
Однако, когда я делаю запрос, я получаю ответ 403 Forbidden вместо ожидаемого 201 Created. Вот код для моей конечной точки в контроллере:
[Authorize("admin")]
[HttpPost]
public async Task<IActionResult> Post([FromBody] ExampleRequest request)
{
// actual code returning Created()
}
конфиг авторизации в Program.cs:
builder.Services.AddAuthorization(options =>
options.AddPolicy("admin", policy =>
policy.RequireClaim("role", "admin")));
Я уверен, что срок действия токена не истек. Заголовки ответов не содержат ничего полезного. Я добавил промежуточное ПО авторизации в приложение (app.UseAuthorization();). Может кто-нибудь сказать мне, что я сделал неправильно?
Кажется, я включил все необходимые детали, но вот исходный код, если вы хотите его проверить.
Спасибо





Вам нужно сообщить ASP.NET Core, как называется утверждение роли, используя что-то вроде:
.AddJwtBearer(options =>
{
...
options.TokenValidationParameters = new TokenValidationParameters
{
NameClaimType = "name",
RoleClaimType = "role"
};
...
}
Для получения более подробной информации вы написали в блоге об этих проблемах здесь:
Удалите AddPolicy и посмотрите, какие утверждения действительно присутствуют в пользовательском объекте. Если вы получаете ошибку 403, значит, вы получили действительный токен, но авторизация вас отклоняет. Действительно ли утверждение роли находится в объекте пользователя?
Это не совсем то, что я хотел, но я использовал ClaimTypes.Role вместо "admin" для ключа роли, удалил AddPolicy в Program.cs, заменил [Authorize("admin")] на [Authorize(Roles = "admin")] aaa, и это как-то сработало! Честно говоря, это не ответ на вопрос (поскольку он использует роли вместо политик, как я изначально хотел), но это хорошее решение, и я буду его придерживаться.
К сожалению не помогло, но спасибо за ответ