Как проверить ошибку при проверке токена jwt с помощью validate-jwt (Ранее: как использовать пользовательский встроенный jwt в validate-jwt?)

Я пытаюсь ограничить доступ к REST API с помощью токена JWT, используя политику validate-jwt. Никогда раньше этого не делал.

Вот моя входящая политика (взята из пункта Простая проверка токена здесь):

<validate-jwt header-name="Authorization" require-scheme="Bearer">
    <issuer-signing-keys>
        <key>{{jwt-signing-key}}</key>
    </issuer-signing-keys>
    <audiences>
        <audience>CustomerNameNotDns</audience>
    </audiences>
    <issuers>
        <issuer>MyCompanyNameNotDns</issuer>
    </issuers>
</validate-jwt>

Используя этот генератор, я создал претензию (я не уверен, правильно ли я понял эмитента и аудиторию):

{
    "iss": "MyCompanyNameNotDns",
    "iat": 1572360380,
    "exp": 2361278784,
    "aud": "CustomerNameNotDns",
    "sub": "Auth"
}

В разделе Подписанный веб-токен JSON я выбрал Создать 64-битный ключ в поле со списком. Сгенерированный ключ я поместил вместо {{jwt-signed-key}}.

Теперь я пытаюсь вызвать API с помощью Postman. Я добавляю заголовок «Авторизация» и в качестве значения ставлю «Bearer {{JWT, созданный связанным генератором}} ".

Я получаю 401, JWT отсутствует. Что я делаю неправильно?


person Maurice Klimek    schedule 29.10.2019    source источник


Ответы (2)


Согласно моим исследованиям, если вы используете алгоритмы подписи HS256, ключ должен быть указан внутри политики в форме, закодированной в base64. Другими словами, мы должны закодировать ключ как строку base64. Дополнительные сведения см. В документ  введите описание изображения здесь

Мои тестовые шаги следующие

  1. Создайте токен Jwt  введите описание изображения здесь  введите описание изображения здесь

  2. Тест a. Если я укажу ключ напрямую в политике, я получу ошибку 401  введите описание изображения здесь

введите здесь описание изображения

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

person Jim Xu    schedule 30.10.2019
comment
Я преобразовал строку с помощью Convert.ToBase64String(Encoding.UTF8.GetBytes(, как вы предложили, но я все еще получаю 401 Unauthorized с сообщением Invalid JWT. Когда я просматриваю раздел трассировки на портале Azure, я узнаю в разделе validate-jwt, что Expression was successfully evaluated.. - person Maurice Klimek; 30.10.2019
comment
Вы предоставили ключ подписки? - person Jim Xu; 30.10.2019
comment
Я отключил ключ подписки для этого API. - person Maurice Klimek; 30.10.2019
comment
Если вы не добавите политику, не могли бы вы вызвать api? - person Jim Xu; 30.10.2019
comment
Да, без политики validate-jwt API работает очень хорошо. - person Maurice Klimek; 30.10.2019
comment
Не могли бы вы проверить, используете ли вы ту же аудиторию и ключ эмитента в своей политике и инструменте? - person Jim Xu; 30.10.2019
comment
Я проверил и использую в Политике те же эмитент значений (строковое название компании), аудиторию (также строковое название компании), что и в этот инструмент. Также используйте тот же ключ, что и сгенерированный. - person Maurice Klimek; 30.10.2019
comment
@MauriceKlimek Согласно предоставленной вами информации, аудитория - это имя клиента, а не название компании. - person Jim Xu; 31.10.2019
comment
@MauriceKlimek Это вы используете алгоритмы подписи HS256? - person Jim Xu; 31.10.2019
comment
это правильно, аудитория - это имя клиента, эмитент - название компании. И я использую алгоритмы подписи HS256. - person Maurice Klimek; 31.10.2019
comment
зачем нужен Convert.ToBase64String? - person hksfho; 12.06.2020

Ответ Джима Сю о кодировании ключа как строки base64 в политике позволил мне зайти так далеко :-)

Я установил для параметра Ocp-Apim-Trace значение true, чтобы отладить его более тщательно. Я перешел по ссылке, указанной в ответе в разделе ocp-apim-trace-location, и в разделе «при ошибке» обнаружил следующее сообщение:

JWT Validation Failed: IDX10225: Lifetime validation failed. The token is missing an Expiration Time. Tokentype: 'System.IdentityModel.Tokens.Jwt.JwtSecurityToken'..

Что забавно, потому что я установил Срок действия ... на 2099.

Я изменил его на месяц, и он работал нормально.

person Maurice Klimek    schedule 06.11.2019