Возникли небольшие проблемы с авторизацией на основе ролей в dotnet core 2.2.3 и Keycloak 4.5.0.
В Keycloak я определил роль «тестер» и роль клиента «разработчик» с соответствующими сопоставлениями ролей для пользователя «администратор». После аутентификации в Keycloak; если я посмотрю на JWT в jwt.io, то увижу следующее:
{
"realm_access": {
"roles": [
"tester"
]
},
"resource_access": {
"template": {
"roles": [
"developer"
]
},
...
},
...
}
В ядре .NET я пробовал множество вещей, таких как добавление [Authorize(Roles = "tester")]
или [Authorize(Roles = "developer")]
к моему методу контроллера, а также использование авторизации на основе политики, где я проверяю context.User.IsInRole("tester")
внутри моей реализации AuthorizationHandler<TRequirement>
.
Если я установлю несколько точек останова в обработчике аутентификации. Когда он попадает, я вижу роли «тестер» и «разработчик», перечисленные в виде элементов под context.user.Claims
IEnumerable следующим образом.
{realm_access: {"roles":["tester"]}}
{resource_access: {"template":{"roles":["developer"]}}}
Таким образом, я должен могу успешно выполнить авторизацию в обработчике аутентификации, проверив значения для realm_access
и resource_access
в коллекции context.user.Claims
, но для этого мне потребуется десериализовать значения утверждений, которые просто кажутся строками JSON.
Я думаю, что должен быть лучший способ, или я делаю что-то не совсем правильно.
«AspNetCore.Authorization» ожидает роли в утверждении (поле) с именем "роли". И это утверждение должно быть массив строк (многозначным). Вам нужно сделать некоторые настройки на стороне Keycloak.
1-й вариант:
Вы можете изменить существующий путь роли.
Перейдите в консоль администратора Keycloak> Области действия клиента> роли> Картографы> роли клиента.
2-й вариант:
Если вы не хотите трогать существующий путь, вы можете создать новый Mapper, чтобы показать те же роли в корне.
Перейдите в консоль администратора Keycloak> Области клиента> роли> Картографы> создать
Имя требования токена ДОЛЖНО быть
role
нетroles