JWT RFC, кажется, не имеет какие-либо проблемы, содержащие сложные массивы, такие как:Комплексных претензий в JWT
{
"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: Я видел this question и this other, где один из авторов Identity Server говорит о чем-то подобном, являющемся антипаттерном. Не уверен, что антипаттерн будет иметь сложную структуру претензий или «детали реализации авторизации» в формуле изобретения.
Любые советы по этому вопросу были бы замечательными!
UPDATE:
Дав некоторые мысли я согласен, имеющей сложную иерархию претензий не желательно, и я мог бы обойти эту проблему с загрязненным раствором предваряя роли для каждого BusinessID. Что-то вроде этого:
{
"email": "[email protected]",
"roles": [
"1_admin",
"1_accountant",
"2_support"
],
"businesses": [
"1_One",
"2_Two"
]
}
таким образом я держу простую структуру и в дальнейшем, на клиенте или API я могу читать претензии и узнать, что 1
это идентификатор для бизнеса с именем One
и имеет роли admin
и account
.
Будет ли это лучшим решением?
Спасибо. Если данные претензии (данные разрешения) меняются, я полагаю, что есть какой-то способ аннулировать токен на сервере идентификации, когда API пытается его проверить, чтобы API мог сообщить клиенту (401), что ему нужно запросить новый токен с претензиями обновлен? – iberodev
Другой вариант - переиздать другой токен для клиента, если он хочет получить доступ к ресурсам других бизнес-ресурсов. Возможно ли использовать вариант арендатора? клиент имеет токен, описывающий его идентификатор пользователя для бизнеса. Один с роли A, B. Пользователь своп в бизнес Два в пользовательском интерфейсе и запрашивает новый токен, отправляя арендатор = businessTwoId, чтобы Identity Server обнаружил, что пользователь все еще аутентифицирован и на этот раз выдает новый токен с информацией о бизнесе Два и его роли.Это упрощает JWT, не уверен, можно ли выпустить разные токены для одного и того же пользователя и другого арендатора? – iberodev
Просто не используйте маркеры для разрешений, и вам не нужно архитектовать вокруг того факта, что они там не принадлежат. – leastprivilege