Поделиться через


Учетные данные сертификата проверки подлинности приложения платформы удостоверений Майкрософт

Платформа удостоверений Майкрософт позволяет приложению использовать для проверки подлинности свои собственные учетные данные везде, где может использоваться секрет клиента, например в потоке предоставления учетных данных клиента OAuth 2.0 и потоке On-Behalf-Of (OBO).

Одной из форм учетных данных, которые приложение может использовать для аутентификации, является утверждение JSON Web Token (JWT), подписанное с помощью сертификата приложения. Описание доступно в спецификации OpenID Connect для параметра проверки подлинности клиента private_key_jwt.

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

Формат утверждения

Чтобы вычислить утверждение, можно использовать одну из множества библиотек JWT на удобном для вас языке (для этого в MSAL используется .WithCertificate()). Эти данные переносятся маркером в заголовке, утверждениях и сигнатуре.

Параметр Комментарий
alg Должен быть PS256
typ Должен иметь значение JWT
x5t#s256 Отпечаток SHA-256 в кодировке Base64url для кодировки DER сертификата X.509.

Утверждения (полезные данные)

Тип утверждения значение Описание
aud https://login.microsoftonline.com/{tenantId}/oauth2/v2.0/token Утверждение "aud" (аудитория) определяет получателей, для которым предназначен JWT (здесь идентификатор Microsoft Entra) См . раздел RFC 7519, раздел 4.1.3. В этом случае получатель является сервером входа (login.microsoftonline.com).
exp 1601519414 Утверждение exp (время окончания срока действия) указывает время окончания срока действия или время, начиная с которого маркер JWT не должен приниматься в обработку. См. раздел 4.1.4 RFC 7519. Утверждение может быть использовано в течение установленного срока, поэтому не делайте его слишком большим (не более 5–10 мин после nbf). Идентификатор Microsoft Entra не помещает ограничения на exp время в данный момент.
iss {ClientID} Утверждение "iss" (издатель) обозначает субъект, который выдал JWT (в данном случае — клиентское приложение). Используйте идентификатор приложения GUID.
jti (идентификатор GUID) Утверждение jti (идентификатор маркера JWT) предоставляет уникальный идентификатор JWT. Значение идентификатора должно быть назначено таким образом, чтобы гарантировать, что существует незначимая вероятность того, что одно и то же значение будет случайно назначено другому объекту данных; если приложение использует несколько издателей, столкновения должны быть предотвращаться среди значений, созданных различными издателями, а также. Значение "jti" является строкой с учетом регистра. RFC 7519, раздел 4.1.7
nbf 1601519114 Утверждение "nbf" (не ранее) определяет время, до которого маркер JWT НЕ ДОЛЖЕН приниматься в обработку. RFC 7519, раздел 4.1.5 Допускается использование текущего времени.
sub {ClientID} Утверждение "sub" (субъект) обозначает субъект JWT, в данном случае — также ваше приложение. Используйте то же значение, что и для iss.
iat 1601519114 Утверждение iat (время выдачи) обозначает время, в которое был создан токен JWT. Это утверждение можно использовать для оценки возраста конкретного токена JWT. RFC 7519, раздел 4.1.5

Подпись

Подпись формируется путем применения сертификата, как описано в спецификации RFC 7519 на JSON Web Token. Используйте заполнение PSS.

Пример декодированного утверждения JWT

{
  "alg": "PS256",
  "typ": "JWT",
  "x5t#sha256": "A1bC2dE3fH4iJ5kL6mN7oP8qR9sT0u"
}
.
{
  "aud": "https: //login.microsoftonline.com/contoso.onmicrosoft.com/oauth2/v2.0/token",
  "exp": 1484593341,
  "iss": "aaaabbbb-0000-cccc-1111-dddd2222eeee",
  "jti": "00aa00aa-bb11-cc22-dd33-44ee44ee44ee",
  "nbf": 1484592741,
  "sub": "aaaaaaaa-0000-1111-2222-bbbbbbbbbbbb"
}
.
"A1bC2dE3fH4iJ5kL6mN7oP8qR9sT0u..."

Пример закодированного утверждения JWT

Ниже приводится строка, которая является примером закодированного утверждения. Если внимательно ее изучить, то можно заметить, что она состоит из трех частей, разделенных точками (.).

  • В первом разделе закодирован заголовок.
  • Во втором разделе закодированы утверждения (полезные данные).
  • Последний раздел является сигнатурой, вычисленной с помощью сертификатов из содержимого первых двух разделов.
"eyJhbGciOiJSUzI1NiIsIng1dCI6Imd4OHRHeXN5amNScUtqRlBuZDdSRnd2d1pJMCJ9.eyJhdWQiOiJodHRwczpcL1wvbG9naW4ubWljcm9zb2Z0b25saW5lLmNvbVwvam1wcmlldXJob3RtYWlsLm9ubWljcm9zb2Z0LmNvbVwvb2F1dGgyXC90b2tlbiIsImV4cCI6MTQ4NDU5MzM0MSwiaXNzIjoiOTdlMGE1YjctZDc0NS00MGI2LTk0ZmUtNWY3N2QzNWM2ZTA1IiwianRpIjoiMjJiM2JiMjYtZTA0Ni00MmRmLTljOTYtNjVkYmQ3MmMxYzgxIiwibmJmIjoxNDg0NTkyNzQxLCJzdWIiOiI5N2UwYTViNy1kNzQ1LTQwYjYtOTRmZS01Zjc3ZDM1YzZlMDUifQ.
Gh95kHCOEGq5E_ArMBbDXhwKR577scxYaoJ1P{a lot of characters here}KKJDEg"

Зарегистрируйте сертификат на платформе удостоверений Майкрософт

Учетные данные сертификата можно связать с клиентским приложением в платформа удостоверений Майкрософт через Центр администрирования Microsoft Entra с помощью любого из следующих методов:

Отправка файла сертификата

На вкладке Регистрация приложений клиентского приложения:

  1. Выберите Сертификаты и секреты>Сертификаты.
  2. Выберите " Отправить сертификат" и выберите файл сертификата для отправки.
  3. Выберите Добавить. После передачи сертификата отображаются значения отпечатка сертификата, даты начала и истечения срока действия.

Обновление манифеста приложения

После получения сертификата вычислите следующие значения:

  • $base64Thumbprint — значение хэша сертификата в кодировке Base64.
  • $base64Value — значение необработанных данных сертификата в кодировке Base64.

В качестве ключа в манифесте приложения ($keyId) предоставьте идентификатор GUID.

При регистрации приложения Azure для клиентского приложения сделайте следующее.

  1. Щелкните Манифест, чтобы открыть манифест приложения.

  2. Замените свойство keyCredentials данными нового сертификата, используя приведенную ниже схему.

    "keyCredentials": [
        {
            "customKeyIdentifier": "$base64Thumbprint",
            "keyId": "$keyid",
            "type": "AsymmetricX509Cert",
            "usage": "Verify",
            "value":  "$base64Value"
        }
    ]
    
  3. Сохраните изменения в манифесте приложения и передайте его на платформу удостоверений Майкрософт.

    Свойство keyCredentials является многозначным, поэтому для расширенного управления ключами можно передать несколько сертификатов.

Использование утверждения клиента

Утверждения клиента можно использовать в любом месте, где может применяться секрет клиента. Например, в потоке кода авторизации можно передать подтверждение client_secret того, что запрос поступает из приложения. Его можно заменить параметрами client_assertion и client_assertion_type.

Параметр Стоимость Описание
client_assertion_type urn:ietf:params:oauth:client-assertion-type:jwt-bearer Это фиксированное значение, указывающее, что вы используете учетные данные сертификата.
client_assertion JWT Созданный выше JWT.

Следующие шаги

Библиотека MSAL.NET обслуживает этот сценарий в одной строке кода.

Консольное приложение управляющей программы .NET с помощью примера кода платформа удостоверений Майкрософт на GitHub показывает, как приложение использует собственные учетные данные для проверки подлинности. В нем также показано, как создать самозаверяющий сертификат с помощью командлета PowerShell New-SelfSignedCertificate. Вы также можете воспользоваться скриптами создания приложений для создания сертификатов, вычисления отпечатков и т. д.