Авторизация на основе ролей с использованием Keycloak и ядра .NET

Возникли небольшие проблемы с авторизацией на основе ролей в 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.

Я думаю, что должен быть лучший способ, или я делаю что-то не совсем правильно.

Socialite Login With Google Account In Laravel 9
Socialite Login With Google Account In Laravel 9
Этот пост изначально был опубликован на techsolutionstuff.com.
6
0
4 241
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

«AspNetCore.Authorization» ожидает роли в утверждении (поле) с именем "роли". И это утверждение должно быть массив строк (многозначным). Вам нужно сделать некоторые настройки на стороне Keycloak.

1-й вариант:

Вы можете изменить существующий путь роли.

Перейдите в консоль администратора Keycloak> Области действия клиента> роли> Картографы> роли клиента.

  • Измените «Имя утверждения токена» на «роли»
  • Многозначный: Истинно
  • Добавить в токен доступа: True

2-й вариант:

Если вы не хотите трогать существующий путь, вы можете создать новый Mapper, чтобы показать те же роли в корне.

Перейдите в консоль администратора Keycloak> Области клиента> роли> Картографы> создать

  • Имя: «роли корневого клиента» (или как хотите)
  • Тип картографа: «Роль пользователя-клиента»
  • Многозначный: Истинно
  • Название токена: «роли»
  • Добавить в токен доступа: True

Имя требования токена ДОЛЖНО быть roleнетroles

Joba 07.10.2020 22:12
3-й вариант: См. мой ответ здесь: stackoverflow.com/a/53817194/10801604
bruegth 24.03.2021 11:32

Другие вопросы по теме