Используйте сертификаты с Microsoft. Identity.Web

Microsoft. Identity.Web поддерживает проверку подлинности на основе сертификатов в качестве безопасной альтернативы секретам клиента для конфиденциальных клиентских приложений. Сертификаты используют асимметричную криптографию, поэтому только владелец закрытого ключа может пройти проверку подлинности.

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

Зачем использовать сертификаты?

Фактор Секрет клиента Сертификат
Безопасность Общий секрет (симметричный) Асимметричная пара ключей
Вращение Требуется повторное развертывание приложения или изменение конфигурации Можно автоматизировать с помощью Key Vault
Риск воздействия Секрет в конфигурации может быть раскрыт Закрытый ключ остается в безопасном хранилище
Соблюдение закона Может не соответствовать корпоративным политикам Соответствует большинству корпоративных требований к безопасности
Рекомендуется для Разработка, прототипирование Производственные рабочие нагрузки

Это важно

Microsoft рекомендует использовать сертификаты вместо клиентских секретов для рабочих приложений. Для обеспечения наивысшего уровня безопасности используйте аутентификацию без сертификатов (управляемую идентификацию или федерацию идентификаций рабочей нагрузки), если ваша среда размещения поддерживает её.

Принцип работы

  1. Вы создаете или получаете сертификат X.509 с закрытым ключом.
  2. Вы регистрируете публичный ключ (или отпечаток) сертификата с регистрацией вашего приложения Microsoft Entra.
  3. Во время выполнения Microsoft. Identity.Web загружает сертификат (включая закрытый ключ) из настроенного источника.
  4. Библиотека использует закрытый ключ для подписи утверждения на стороне клиента, которое отправляется в Microsoft Entra ID для получения токенов.

Источники сертификатов

Microsoft. Identity.Web поддерживает загрузку сертификатов из нескольких источников:

Тип источника значение SourceType Лучше всего подходит для
Azure Key Vault KeyVault Производственная среда (рекомендуется)
Хранилище сертификатов StoreWithThumbprint или StoreWithDistinguishedName Windows серверы, локальные
Путь к файлу Path Разработка, контейнерные приложения
Строка в кодировке Base64 Base64Encoded Секреты Kubernetes, конвейеры CI/CD

Вы настраиваете учетные данные сертификата в массиве ClientCertificates в разделе конфигурации AzureAd (или AzureAdB2C). Можно указать несколько сертификатов для сценариев смены — Microsoft. Identity.Web использует первый допустимый сертификат, который он находит.


Azure Key Vault — это рекомендуемый источник для сертификатов в рабочей среде. Она обеспечивает централизованное управление, управление доступом, аудит и возможности автоматической смены.

Конфигурация

Добавьте конфигурацию сертификата в вашу appsettings.json:

{
  "AzureAd": {
    "Instance": "https://login.microsoftonline.com/",
    "TenantId": "your-tenant-id",
    "ClientId": "your-client-id",

    "ClientCertificates": [
      {
        "SourceType": "KeyVault",
        "KeyVaultUrl": "https://your-keyvault-name.vault.azure.net",
        "KeyVaultCertificateName": "your-certificate-name"
      }
    ]
  }
}
Недвижимость Описание
SourceType Этот параметр должен содержать значение "KeyVault".
KeyVaultUrl URI вашего Azure Key Vault (например, https://myapp-kv.vault.azure.net).
KeyVaultCertificateName Имя сертификата, хранящегося в Key Vault.

Настройка политик доступа Key Vault

Удостоверение приложения должно иметь разрешение на чтение сертификатов из Хранилища ключей. От того, используете ли вы модель политики доступа хранилища или ролевое управление доступом Azure (RBAC), зависит способ предоставления.

Вариант 1: Политика доступа к хранилищу

az keyvault set-policy \
  --name your-keyvault-name \
  --object-id <app-or-managed-identity-object-id> \
  --certificate-permissions get list \
  --secret-permissions get

Замечание

Требуется разрешение --secret-permissions get, так как Azure Key Vault сохраняет закрытый ключ в виде секрета, связанного с сертификатом. Microsoft. Identity.Web должен иметь доступ как к сертификату, так и к его закрытому ключу.

Вариант 2. Azure RBAC

Назначьте приложению роль «пользователь сертификата хранилища ключей» Key Vault:

az role assignment create \
  --role "Key Vault Certificate User" \
  --assignee <app-or-managed-identity-object-id> \
  --scope /subscriptions/<sub-id>/resourceGroups/<rg>/providers/Microsoft.KeyVault/vaults/<vault-name>

Использование управляемого удостоверения для доступа к Key Vault

Когда приложение выполняется в Azure (служба приложений, Функции Azure, Служба Azure Kubernetes, виртуальные машины), используйте управляемое удостоверение для проверки подлинности в Key Vault. Это устраняет необходимость в каких-либо учетных данных для доступа к самому хранилищу.

Назначаемое системой управляемое удостоверение

Если в приложении включено управляемое удостоверение, назначаемое системой, Microsoft. Identity.Web автоматически использует DefaultAzureCredential для проверки подлинности в Key Vault. Дополнительная конфигурация не требуется за пределами ClientCertificates записи:

{
  "AzureAd": {
    "Instance": "https://login.microsoftonline.com/",
    "TenantId": "your-tenant-id",
    "ClientId": "your-client-id",

    "ClientCertificates": [
      {
        "SourceType": "KeyVault",
        "KeyVaultUrl": "https://your-keyvault-name.vault.azure.net",
        "KeyVaultCertificateName": "your-certificate-name"
      }
    ]
  }
}

Управляемое удостоверение, назначаемое пользователем

Для пользовательского управляемого удостоверения укажите ManagedIdentityClientId в описателе сертификата Key Vault:

{
  "AzureAd": {
    "Instance": "https://login.microsoftonline.com/",
    "TenantId": "your-tenant-id",
    "ClientId": "your-client-id",

    "ClientCertificates": [
      {
        "SourceType": "KeyVault",
        "KeyVaultUrl": "https://your-keyvault-name.vault.azure.net",
        "KeyVaultCertificateName": "your-certificate-name",
        "ManagedIdentityClientId": "user-assigned-managed-identity-client-id"
      }
    ]
  }
}

Подсказка

При локальном запуске во время разработки DefaultAzureCredential возвращается к учетным данным Azure CLI или Visual Studio. Убедитесь, что вы выполнили вход с помощью az login и что у вашей учетной записи разработчика есть соответствующие Key Vault разрешения.


Из хранилища сертификатов (только Windows)

В Windows можно загрузить сертификаты из хранилища сертификатов Windows. Это обычно для локальных или размещенных в IIS развертываний.

По отпечатку пальца

Используется StoreWithThumbprint для идентификации сертификата по отпечатку SHA-1:

{
  "AzureAd": {
    "Instance": "https://login.microsoftonline.com/",
    "TenantId": "your-tenant-id",
    "ClientId": "your-client-id",

    "ClientCertificates": [
      {
        "SourceType": "StoreWithThumbprint",
        "CertificateStorePath": "CurrentUser/My",
        "CertificateThumbprint": "A1B2C3D4E5F6A1B2C3D4E5F6A1B2C3D4E5F6A1B2"
      }
    ]
  }
}
Недвижимость Описание
SourceType Этот параметр должен содержать значение "StoreWithThumbprint".
CertificateStorePath Расположение хранилища сертификатов. Общие значения: "CurrentUser/My", "LocalMachine/My".
CertificateThumbprint Отпечаток SHA-1 сертификата (40 шестнадцатеричных символов).

Отличительное имя

Используйте StoreWithDistinguishedName, чтобы идентифицировать сертификат по имени субъекта:

{
  "AzureAd": {
    "Instance": "https://login.microsoftonline.com/",
    "TenantId": "your-tenant-id",
    "ClientId": "your-client-id",

    "ClientCertificates": [
      {
        "SourceType": "StoreWithDistinguishedName",
        "CertificateStorePath": "CurrentUser/My",
        "CertificateDistinguishedName": "CN=MyAppCertificate"
      }
    ]
  }
}
Недвижимость Описание
SourceType Этот параметр должен содержать значение "StoreWithDistinguishedName".
CertificateStorePath Расположение хранилища сертификатов. Общие значения: "CurrentUser/My", "LocalMachine/My".
CertificateDistinguishedName Отличительное имя субъекта сертификата (например, "CN=MyAppCertificate").

Расположения хранилища сертификатов

В следующей таблице перечислены общие пути к хранилищу сертификатов и разрешения, необходимые для доступа к ним:

Путь Описание Требуются разрешения
CurrentUser/My Личное хранилище текущего пользователя Доступ на уровне пользователя
LocalMachine/My Личное хранилище для всей системы Доступ администратора
LocalMachine/Root Доверенные корневые центры сертификации Доступ администратора
CurrentUser/Root Текущие доверенные корневые центры сертификации пользователей Доступ на уровне пользователя

Замечание

При размещении в IIS учетная запись пула приложений должна иметь доступ на чтение к закрытому ключу сертификата. Это можно предоставить с помощью параметра "Управление закрытыми ключами " в оснастке MMC "Сертификаты".


Из файлового пути

Вы можете загрузить сертификат непосредственно из .pfx файла PKCS#12 на диске.

Предупреждение

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

Конфигурация

Добавьте путь к файлу сертификата и пароль:appsettings.json

{
  "AzureAd": {
    "Instance": "https://login.microsoftonline.com/",
    "TenantId": "your-tenant-id",
    "ClientId": "your-client-id",

    "ClientCertificates": [
      {
        "SourceType": "Path",
        "CertificateDiskPath": "/path/to/certificate.pfx",
        "CertificatePassword": "your-certificate-password"
      }
    ]
  }
}
Недвижимость Описание
SourceType Этот параметр должен содержать значение "Path".
CertificateDiskPath Абсолютный или относительный путь к файлу .pfx .
CertificatePassword Пароль для .pfx файла. Если сертификат не имеет пароля, опустите это свойство или задайте для него пустую строку.

Подсказка

Чтобы избежать хранения пароля в виде обычного текста в appsettings.json, используйте его из переменной среды или диспетчера секретов.

Использование секретов пользователя .NET (разработка):

dotnet user-secrets set "AzureAd:ClientCertificates:0:CertificatePassword" "your-password"

Использование переменной среды:

export AzureAd__ClientCertificates__0__CertificatePassword="your-password"

Из значения в кодировке Base64

Сертификат можно указать в виде строки в кодировке Base64. Этот подход полезен при внедрении сертификатов с помощью переменных среды, секретов Kubernetes или переменных конвейера CI/CD.

Конфигурация

Добавьте значение сертификата в кодировке Base64 в ваш appsettings.json:

{
  "AzureAd": {
    "Instance": "https://login.microsoftonline.com/",
    "TenantId": "your-tenant-id",
    "ClientId": "your-client-id",

    "ClientCertificates": [
      {
        "SourceType": "Base64Encoded",
        "Base64EncodedValue": "MIIKcQIBAzCCCi0GCSqGSIb3DQEHAaCCCh4Egg..."
      }
    ]
  }
}
Недвижимость Описание
SourceType Этот параметр должен содержать значение "Base64Encoded".
Base64EncodedValue Полный сертификат (включая закрытый ключ) закодирован как строка Base64.

Создание значения Base64

Конвертируйте файл .pfx в строку Base64:

PowerShell:

$certBytes = [System.IO.File]::ReadAllBytes("path/to/certificate.pfx")
$base64 = [System.Convert]::ToBase64String($certBytes)
$base64 | Set-Clipboard  # Copies to clipboard

Bash:

base64 -w 0 path/to/certificate.pfx

Использование с секретами Kubernetes

Сохраните сертификат в кодировке Base64 в секрете Kubernetes и сопоставите его с переменной среды:

apiVersion: v1
kind: Secret
metadata:
  name: app-cert-secret
type: Opaque
data:
  AzureAd__ClientCertificates__0__Base64EncodedValue: <base64-encoded-pfx>

Укажите секрет в развертывании:

env:
  - name: AzureAd__ClientCertificates__0__SourceType
    value: "Base64Encoded"
  - name: AzureAd__ClientCertificates__0__Base64EncodedValue
    valueFrom:
      secretKeyRef:
        name: app-cert-secret
        key: AzureAd__ClientCertificates__0__Base64EncodedValue

Использование в конвейерах CI/CD

В Azure DevOps или GitHub Actions сохраните сертификат в кодировке Base64 как секретную переменную, а затем задайте ее в качестве переменной среды во время выполнения.

GitHub Actions example:

env:
  AzureAd__ClientCertificates__0__SourceType: "Base64Encoded"
  AzureAd__ClientCertificates__0__Base64EncodedValue: ${{ secrets.APP_CERTIFICATE_BASE64 }}

Azure DevOps example:

variables:
  AzureAd__ClientCertificates__0__SourceType: "Base64Encoded"
  AzureAd__ClientCertificates__0__Base64EncodedValue: $(AppCertificateBase64)

Это важно

Несмотря на то, что сертификат закодирован в Кодировке Base64, он содержит закрытый ключ и должен рассматриваться как секрет. Всегда используйте секретные переменные в конвейерах CI/CD — никогда не добавляйте сертификаты в кодировке Base64 в систему контроля версий.


Настройка сертификатов в коде C#

Помимо конфигурации JSON можно программно настроить учетные данные сертификата с помощью класса CredentialDescription из Microsoft.Identity.Abstractions.

Вспомогательные методы

Класс предоставляет статические вспомогательные CredentialDescription методы для каждого типа источника сертификата:

using Microsoft.Identity.Abstractions;

// From Azure Key Vault
var kvCredential = CredentialDescription.FromKeyVault(
    "https://your-keyvault-name.vault.azure.net",
    "your-certificate-name");

// From certificate store (by thumbprint)
var thumbprintCredential = CredentialDescription.FromCertificateStore(
    "CurrentUser/My",
    thumbprint: "A1B2C3D4E5F6A1B2C3D4E5F6A1B2C3D4E5F6A1B2");

// From certificate store (by distinguished name)
var dnCredential = CredentialDescription.FromCertificateStore(
    "CurrentUser/My",
    distinguishedName: "CN=MyAppCertificate");

// From file path
var pathCredential = CredentialDescription.FromCertificatePath(
    "/path/to/certificate.pfx",
    "your-certificate-password");

// From Base64-encoded string
var base64Credential = CredentialDescription.FromBase64String(
    "MIIKcQIBAzCCCi0GCSqGSIb3DQEHAaCCCh4Egg...");

Использование в ASP.NET Core

Передайте описания учетных данных непосредственно при настройке аутентификации.

builder.Services.AddAuthentication(OpenIdConnectDefaults.AuthenticationScheme)
    .AddMicrosoftIdentityWebApp(options =>
    {
        options.Instance = "https://login.microsoftonline.com/";
        options.TenantId = "your-tenant-id";
        options.ClientId = "your-client-id";
        options.ClientCredentials = new[]
        {
            CredentialDescription.FromKeyVault(
                "https://your-keyvault-name.vault.azure.net",
                "your-certificate-name")
        };
    });

Подсказка

Вспомогательные методы эквивалентны настройке свойств объекта CredentialDescription вручную. Они предоставляют более краткий синтаксис при настройке учетных данных в коде, а не через appsettings.json.


Создание самозаверяющего сертификата для разработки

Для локальной разработки и тестирования можно создать самозаверяющий сертификат. Не используйте самозаверяющие сертификаты в производственной среде.

Использование PowerShell (Windows)

Выполните следующие команды, чтобы создать самозаверяющий сертификат, экспортировать его и отобразить отпечаток:

$cert = New-SelfSignedCertificate `
  -Subject "CN=MyDevCertificate" `
  -CertStoreLocation "Cert:\CurrentUser\My" `
  -KeyExportPolicy Exportable `
  -KeySpec Signature `
  -KeyLength 2048 `
  -KeyAlgorithm RSA `
  -HashAlgorithm SHA256 `
  -NotAfter (Get-Date).AddYears(2)

# Export the .pfx file (with private key)
$password = ConvertTo-SecureString -String "YourPassword123!" -Force -AsPlainText
Export-PfxCertificate -Cert $cert -FilePath ".\MyDevCertificate.pfx" -Password $password

# Export the .cer file (public key only — for app registration)
Export-Certificate -Cert $cert -FilePath ".\MyDevCertificate.cer"

# Display the thumbprint
Write-Host "Thumbprint: $($cert.Thumbprint)"

Использование OpenSSL (кроссплатформенная версия)

Выполните следующие команды, чтобы создать сертификат, упаковать его в виде .pfx файла и отобразить отпечаток:

# Generate a self-signed certificate and private key
openssl req -x509 -newkey rsa:2048 \
  -keyout key.pem -out cert.pem \
  -days 730 -nodes \
  -subj "/CN=MyDevCertificate"

# Package into a .pfx file
openssl pkcs12 -export \
  -out MyDevCertificate.pfx \
  -inkey key.pem -in cert.pem \
  -passout pass:YourPassword123!

# Get the thumbprint
openssl x509 -in cert.pem -noout -fingerprint -sha1

Использование интерфейса командной строки .NET

Экспорт сертификата разработки HTTPS .pfx в виде файла:

dotnet dev-certs https --export-path ./MyDevCertificate.pfx --password YourPassword123!

Замечание

Команда dotnet dev-certs создает сертификат разработки HTTPS. Хотя его можно использовать для тестирования загрузки сертификатов, он предназначен в основном для локального HTTPS и может не подходить для всех сценариев тестирования проверки подлинности.


Регистрация сертификата в Microsoft Entra ID

После создания или получения сертификата необходимо зарегистрировать его открытый ключ в регистрации приложения в Microsoft Entra ID.

Использование портала Azure

  1. Перейдите на портал Azure и перейдите к Microsoft Entra ID>Регистрация приложений.
  2. Выберите приложение.
  3. Выберите Сертификаты и секреты>Сертификаты>Загрузить сертификат.
  4. Загрузите файл .cer или .pem, содержащий только открытый ключ. Не загружайте файл .pfx, содержащий закрытый ключ.
  5. Обратите внимание, что значение отпечатка отображаемое после загрузки, может потребоваться для настройки.

Использование Azure CLI

az ad app credential reset \
  --id <application-client-id> \
  --cert @/path/to/certificate.pem \
  --append

Флаг --append добавляет сертификат без удаления существующих учетных данных.

Использование Microsoft Graph PowerShell

$certData = [System.IO.File]::ReadAllBytes(".\MyDevCertificate.cer")
$base64Cert = [System.Convert]::ToBase64String($certData)

$keyCredential = @{
    type = "AsymmetricX509Cert"
    usage = "Verify"
    key = [System.Convert]::FromBase64String($base64Cert)
    displayName = "MyAppCertificate"
}

Update-MgApplication -ApplicationId <app-object-id> -KeyCredentials @($keyCredential)

Это важно

Отправьте только открытый ключ (.cer или .pem) в регистрацию приложения. Никогда не отправляет .pfx файл, содержащий закрытый ключ. Закрытый ключ должен оставаться безопасным и доступным только для приложения.


Ротация сертификатов

Замена сертификатов заменяет сертификат с истекающим сроком действия новым сертификатом до его истечения, обеспечивая непрерывную работу сервиса.

Стратегия: Перекрытие сертификатов

Рекомендуемый подход использует перекрывающиеся сроки действия:

  1. Создайте новый сертификат до истечения срока действия текущего сертификата (например, 30–60 дней заранее).
  2. Регистрируйте новый сертификат в регистрации приложения Microsoft Entra вместе с существующим. Microsoft Entra ID принимает маркеры, подписанные любым зарегистрированным сертификатом.
  3. Разверните новый сертификат в источнике сертификатов вашего приложения (Key Vault, хранилище сертификатов и т. д.).
  4. Обновите конфигурацию (при необходимости), чтобы указать новый сертификат.
  5. Удалите старый сертификат из регистрации приложения после подтверждения того, что все экземпляры используют новый.

Несколько сертификатов в конфигурации

Microsoft. Identity.Web поддерживает указание нескольких сертификатов. Библиотека пытается проверить их одно за другим и использует первый допустимый сертификат.

{
  "AzureAd": {
    "ClientCertificates": [
      {
        "SourceType": "KeyVault",
        "KeyVaultUrl": "https://your-keyvault.vault.azure.net",
        "KeyVaultCertificateName": "new-cert-2026"
      },
      {
        "SourceType": "KeyVault",
        "KeyVaultUrl": "https://your-keyvault.vault.azure.net",
        "KeyVaultCertificateName": "current-cert-2025"
      }
    ]
  }
}

Автоматическая ротация с помощью Azure Key Vault

Azure Key Vault поддерживает автоматическое продление сертификатов. При включении автоповорота:

  1. Key Vault создает новую версию сертификата до истечения срока действия.
  2. Microsoft. Identity.Web автоматически выбирает последнюю версию (при следующем выборе сертификата).
  3. Старая версия сертификата остается допустимой до истечения срока действия.

Чтобы настроить автоматический поворот в Key Vault (Хранилище ключей), выполните приведенные действия.

az keyvault certificate set-attributes \
  --vault-name your-keyvault-name \
  --name your-certificate-name \
  --policy @rotation-policy.json

Подсказка

Для приложений с длительными процессами рекомендуется реализовать периодическое обновление сертификата. Microsoft. Identity.Web кэширует сертификат в памяти. Если сертификат заменяется в Key Vault, приложение получает новый сертификат при следующем создании экземпляра конфиденциального клиентского приложения MSAL, когда возникает необходимость.


Устранение ошибок сертификата

В этом разделе перечислены распространенные сообщения об ошибках и их решения.

Распространенные ошибки

Сертификат не найден

Сообщение об ошибке

System.Security.Cryptography.CryptographicException: The certificate cannot be found.

Возможные причины и решения:

Причина Решение
Неправильный отпечаток Убедитесь, что отпечаток в конфигурации соответствует установленному сертификату. Удалите все скрытые символы (пробелы, невидимый Юникод).
Неправильное хранилище сертификатов Подтвердите, что CertificateStorePath соответствует местам, где установлен сертификат (CurrentUser/My vs LocalMachine/My).
Сертификат не установлен Импортируйте сертификат в правильное хранилище с помощью certmgr.msc (CurrentUser) или certlm.msc (LocalMachine).
Несоответствие имени хранилища ключей Key Vault Проверьте, правильно ли KeyVaultUrl и KeyVaultCertificateName.
Файл не найден Убедитесь, что CertificateDiskPath указывает на существующий .pfx файл и приложение имеет доступ на чтение.

Доступ к Key Vault запрещен

Сообщение об ошибке

Azure.RequestFailedException: The user, group or application '...' does not have certificates get permission on key vault '...'

Решения:

  • Убедитесь, что политики доступа предоставляют get разрешение для сертификатов и секретов.
  • При использовании Azure RBAC убедитесь, что идентификация имеет роль пользователь сертификата Key Vault.
  • Для управляемой идентификации убедитесь, что идентификация активирована, а правильный идентификатор объекта применяется в политике.

Закрытый ключ сертификата недоступен

Сообщение об ошибке

System.Security.Cryptography.CryptographicException: Keyset does not exist.

Решения:

  • Убедитесь, что в Windows/IIS идентификатор пула приложений имеет доступ на чтение к закрытому ключу. Используйте оснастку MMC сертификатов для предоставления доступа с помощью Управление закрытыми ключами.
  • В Linux, убедитесь, что файл имеет правильные файловые разрешения (.pfx).
  • Убедитесь, что сертификат экспортирован с закрытым ключом (Export-PfxCertificate или openssl pkcs12 -export).

Срок действия сертификата истек

Сообщение об ошибке

AADSTS700027: Client assertion contains an invalid signature. The key was expired.

Решения:

  • Проверьте срок действия сертификата: openssl x509 -in cert.pem -noout -dates
  • Создайте новый сертификат и обновите регистрацию приложения и конфигурацию приложения.
  • Реализуйте смену сертификатов, чтобы предотвратить будущие проблемы с истечением срока действия. См. ротацию сертификатов.

Неправильный пароль сертификата

Сообщение об ошибке

System.Security.Cryptography.CryptographicException: The specified network password is not correct.

Решения:

  • Проверьте, чтобы CertificatePassword совпадал с паролем, используемым при экспорте файла .pfx.
  • При использовании переменных среды проверьте наличие проблем с кодировкой (конечные новые строки, специальные символы).
  • Повторно экспортируйте сертификат с известным паролем.

Контрольный список диагностики

Используйте этот контрольный список, если проверка подлинности сертификата не работает:

  • [ ] Срок действия сертификата — находится ли сертификат в пределах своего срока действия? Проверьте даты NotBefore и NotAfter.
  • [ ] Регистрация приложения — открытый ключ сертификата отправляется в правильную регистрацию приложения?
  • [ ] Совпадение отпечатка — соответствует ли отпечаток в конфигурации сертификату в регистрации приложения?
  • [ ] Доступ к закрытому ключу — может ли процесс приложения считывать закрытый ключ сертификата?
  • [ ] Key Vault разрешения — имеет ли удостоверение для источников Key Vault права доступа certificates/get и secrets/get?
  • [ ] Раздел конфигурации — настроена ли конфигурация сертификата в правильном разделе (AzureAd или AzureAdB2C)?
  • [ ] пакеты NuGet — актуально ли Microsoft.Identity.Web? Более ранние версии могут не поддерживать определенные типы источников сертификатов.

Включение ведения журнала

Чтобы получить подробные диагностические сведения, включите ведение журнала MSAL:

builder.Services.AddMicrosoftIdentityWebAppAuthentication(builder.Configuration, "AzureAd")
    .EnableTokenAcquisitionToCallDownstreamApi()
    .AddInMemoryTokenCaches();

builder.Logging.AddFilter("Microsoft.Identity", LogLevel.Debug);

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