2016-09-07 11 views
2

JWT RFC, кажется, не имеет какие-либо проблемы, содержащие сложные массивы, такие как:Комплексных претензий в JWT

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

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

Я видел, что с IdentityServer4 претензии добавляются к ProfileDataRequestContextIEnumerable<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.

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

ответ

4

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

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

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

+0

Спасибо. Если данные претензии (данные разрешения) меняются, я полагаю, что есть какой-то способ аннулировать токен на сервере идентификации, когда API пытается его проверить, чтобы API мог сообщить клиенту (401), что ему нужно запросить новый токен с претензиями обновлен? – iberodev

+0

Другой вариант - переиздать другой токен для клиента, если он хочет получить доступ к ресурсам других бизнес-ресурсов. Возможно ли использовать вариант арендатора? клиент имеет токен, описывающий его идентификатор пользователя для бизнеса. Один с роли A, B. Пользователь своп в бизнес Два в пользовательском интерфейсе и запрашивает новый токен, отправляя арендатор = businessTwoId, чтобы Identity Server обнаружил, что пользователь все еще аутентифицирован и на этот раз выдает новый токен с информацией о бизнесе Два и его роли.Это упрощает JWT, не уверен, можно ли выпустить разные токены для одного и того же пользователя и другого арендатора? – iberodev

+1

Просто не используйте маркеры для разрешений, и вам не нужно архитектовать вокруг того факта, что они там не принадлежат. – leastprivilege