Сложные претензии в JWT

Кажется, что в JWT RFC нет проблем со сложными массивами, такими как:

{
    "email": "[email protected]",
    "businesses": [
        {
            "businessId": "1",
            "businessName": "One",
            "roles": [
                  "admin",
                  "accountant"
            ]
        },
        {
            "businessId": "2",
            "businessName": "Two",
            "roles": [
                  "support"
            ]
        }
     ]
}

И это кажется желательным сценарием для наших нужд, поскольку как часть токена мы хотели бы иметь список предприятий, к которым пользователь имеет доступ, и какие роли он выполняет для каждого бизнеса (это часть его идентичности). Политики авторизации в API позже поймут эти группы и применит необходимую логику авторизации.

Я видел, что с IdentityServer4 утверждения добавляются к свойству ProfileDataRequestContext IEnumerable<Claim> IssuedClaims.

Есть ли какая-либо рекомендуемая альтернатива этой сложной структуре претензий? Если нет, есть ли способ построить эту структуру с помощью IdentityServer4 (возможно, какое-то расширение?), Или единственный способ - вручную сериализовать JSON, поскольку утверждение, похоже, принимает только строку?

PS: я видел этот вопрос и этот другой, где один из авторов Identity Server говорит о том, что нечто подобное является антипаттерном. Не уверен, будет ли антипаттерн иметь сложную структуру утверждений или «детали реализации авторизации» в утверждениях.

Любой совет по этому поводу был бы замечательным!

ОБНОВЛЕНИЕ:

Поразмыслив, я согласен, что наличие сложной иерархии требований нежелательно, и я мог бы обойти эту проблему с помощью грязного решения префикса ролей для каждого businessId. Что-то вроде этого:

{
    "email": "[email protected]",
    "roles": [
        "1_admin",
        "1_accountant",
        "2_support"
     ],
     "businesses": [
        "1_One",
        "2_Two" 
     ]
}

таким образом я сохраняю простую структуру, а позже, на клиенте или в API, я могу прочитать претензии и узнать, что 1 - это идентификатор компании с именем One, и у нее есть роли admin и account.

Было бы это лучшим решением?


person diegosasw    schedule 07.09.2016    source источник


Ответы (1)


Заявления касаются идентификационной информации, а не сложных «объектов» разрешений. Вам будет гораздо лучше со специальной службой разрешений, которая возвращает ваши разрешения в любом формате, который вы хотите, в зависимости от личности пользователя.

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

Тем не менее, в .NET утверждения всегда являются строками, но вы можете сериализовать в него объекты JSON, установив для ClaimValueType значение IdentityServerConstants.ClaimValueTypes.Json.

person leastprivilege    schedule 08.09.2016
comment
Спасибо. Если претензии (данные разрешения) изменяются, я полагаю, что есть способ сделать токен недействительным на сервере идентификации, когда API пытается его проверить, чтобы API мог сообщить клиенту (401), что ему необходимо запросить новый токен с утверждениями. обновлено? - person diegosasw; 08.09.2016
comment
Другой вариант - перевыпустить другой токен для клиента, если он хочет получить доступ к каким-либо другим бизнес-ресурсам. Здесь можно использовать вариант арендатора? У клиента есть токен, описывающий его личность пользователя для Business One с ролями A, B. Пользователь переключается на Business Two в пользовательском интерфейсе и запрашивает новый токен, отправляя tenant = businessTwoId, чтобы Identity Server видел, что пользователь все еще аутентифицирован, и выдает новый токен на этот раз с информацией о Business Two и его ролях. Это упрощает JWT, вы не уверены, можно ли выпускать разные токены для одного и того же пользователя и для разных клиентов? - person diegosasw; 08.09.2016
comment
Просто не используйте токены для разрешений, и вам не нужно строить архитектуру вокруг того факта, что они там не принадлежат. - person leastprivilege; 08.09.2016
comment
@leastprivilege у вас есть дополнительная информация о том, почему мы не должны использовать JWT для авторизации? - person tuler; 30.11.2016
comment
Используйте раздел полезной нагрузки токена. Ссылка stackoverflow.com/questions/29715178/ - person Lovjith; 25.07.2019
comment
@leastprivilege, не могли бы вы рассказать, как вы получаете разрешения для пользователя при каждом запросе? Я вижу, вы говорите, что не помещайте их в JWT, но, похоже, не так много информации о том, как и где они должны быть. - person Seabizkit; 03.12.2019