Защита изолированного приложения ASP.NET Core Blazor WebAssembly с помощью Azure Active Directory B2C

Примечание.

Это не последняя версия этой статьи. В текущем выпуске см . версию .NET 8 этой статьи.

Внимание

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

В текущем выпуске см . версию .NET 8 этой статьи.

В этой статье описывается, как создать изолированное приложение Blazor WebAssembly, использующее Azure Active Directory (AAD) B2C для проверки подлинности.

Дополнительные сведения о сценариях безопасности после чтения этой статьи см. в разделе ASP.NET Основных Blazor WebAssembly дополнительных сценариев безопасности.

Пошаговое руководство

В подразделах пошагового руководства объясняется, как:

  • Создание клиента в Azure
  • Регистрация приложения в Azure
  • Blazor Создание приложения
  • Выполнить приложение

Создание клиента в Azure

Следуйте инструкциям из руководства. Создание клиента Azure Active Directory B2C для создания клиента AAD B2C.

Прежде чем продолжить работу с рекомендациями этой статьи, убедитесь, что вы выбрали правильный каталог для клиента AAD B2C.

Регистрация приложения в Azure

Зарегистрируйте приложение AAD B2C:

  1. Перейдите к Azure AD B2C в портал Azure. На боковой панели выберите Регистрация приложений. Нажмите кнопку Новая регистрация.
  2. Укажите имя приложения (например, BlazorИзолированный AAD B2C).
  3. Для поддерживаемых типов учетных записей выберите вариант с несколькими клиентами: учетные записи в любом каталоге организации или любом поставщике удостоверений. Для проверки подлинности пользователей с помощью Azure AD B2C.
  4. Задайте раскрывающийся список URI перенаправления для одностраничного приложения (SPA) и укажите следующий URI перенаправления: https://localhost/authentication/login-callback Если вы знаете URI перенаправления рабочей среды для узла Azure по умолчанию (например, azurewebsites.net) или узла личного домена (к примеру, contoso.com), можно также добавить URI перенаправления рабочей среды одновременно с URI перенаправления localhost. Не забудьте включить номер для портов помимо :443 в любые добавленные URI перенаправления рабочей среды.
  5. Если вы используете непроверенный домен издателя, убедитесь, что установлен флажок Разрешения>Предоставьте согласие администратора для разрешений openid и offline_access. Если домен издателя является проверенным, этот флажок отсутствует.
  6. Выберите Зарегистрировать.

Примечание.

Указывать номер порта для URI перенаправления AAD B2C localhost не требуется. Дополнительные сведения см. в разделе об ограничениях и ограничениях URI перенаправления (URL-адрес ответа): исключения Localhost (документация по Entra).

Запишите следующие сведения:

  • Идентификатор приложения (клиента) (например, 41451fa7-82d9-4673-8fa5-69eff5a761fd).
  • Экземпляр AAD B2C (например, https://contoso.b2clogin.com/, который включает косую черту в конце). Экземпляр — это схема и узел регистрации приложения Azure B2C, которую можно найти в окне Конечные точки на странице Регистрации приложений на портале Azure.
  • Основной домен AAD B2C/домен издателя/домен клиента (например, contoso.onmicrosoft.com). Домен доступен в качестве домена издателя в колонке Фирменная символика на портале Azure для зарегистрированного приложения.

В конфигурациях платформы проверки подлинности>>одностраничное приложение:

  1. Подтвердите наличие URI перенаправления https://localhost/authentication/login-callback .
  2. В разделе неявного предоставления убедитесь, что проверка boxes для маркеров доступа и маркеров идентификаторов не выбраны. Неявное предоставление не рекомендуется для Blazor приложений с помощью MSAL версии 2.0 или более поздней версии. Дополнительные сведения см. в статье Защита ASP.NET Core Blazor WebAssembly.
  3. Для остальных параметров можно оставить значения по умолчанию.
  4. Нажмите кнопку "Сохранить", если вы внесли изменения.

В разделе Home>Azure AD B2C>Потоки пользователей выполните указанные ниже действия.

Создайте поток пользователя для регистрации и входа в систему

Чтобы заполнить context.User.Identity?.Name/context.User.Identity.Name в компоненте LoginDisplay (Shared/LoginDisplay.razor), выберите хотя бы атрибут пользователя Утверждения приложения>Отображаемое имя.

Запишите имя потока пользователя для регистрации и входа, созданное для приложения (например, B2C_1_signupsignin).

Blazor Создание приложения

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

dotnet new blazorwasm -au IndividualB2C --aad-b2c-instance "{AAD B2C INSTANCE}" --client-id "{CLIENT ID}" --domain "{TENANT DOMAIN}" -o {PROJECT NAME} -ssp "{SIGN UP OR SIGN IN POLICY}"
Заполнитель Название на портале Azure Пример
{AAD B2C INSTANCE} Экземпляр https://contoso.b2clogin.com/ (включает косую черту в конце)
{PROJECT NAME} BlazorSample
{CLIENT ID} Идентификатор приложения (клиент) 41451fa7-82d9-4673-8fa5-69eff5a761fd
{SIGN UP OR SIGN IN POLICY} Поток регистрации/входа пользователей B2C_1_signupsignin1
{TENANT DOMAIN} Основной домен/домен издателя/домен клиента contoso.onmicrosoft.com

Выходное расположение, указанное с -o|--output параметром, создает папку проекта, если она не существует и становится частью имени проекта.

Добавьте пару параметров MsalProviderOptions для openid и offline_accessDefaultAccessTokenScopes:

builder.Services.AddMsalAuthentication(options =>
{
    ...
    options.ProviderOptions.DefaultAccessTokenScopes.Add("openid");
    options.ProviderOptions.DefaultAccessTokenScopes.Add("offline_access");
});

После создания приложения вы сможете:

Выполнить приложение

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

  • Visual Studio
    • Нажмите кнопку Запустить.
    • В меню выберите Отладка>Начать отладку.
    • Нажмите клавишу F5.
  • Командная оболочка .NET CLI: выполните dotnet run команду из папки приложения.

Части приложения

В этом разделе описываются части приложения, созданные на основе Blazor WebAssembly шаблона проекта, и способы настройки приложения. В этом разделе нет конкретных рекомендаций для базового рабочего приложения, если вы создали приложение с помощью руководства в разделе "Пошаговое руководство ". Руководство в этом разделе полезно для обновления приложения для проверки подлинности и авторизации пользователей. Однако альтернативный подход к обновлению приложения — создать новое приложение из руководства в разделе "Пошаговое руководство " и переместить компоненты, классы и ресурсы приложения в новое приложение.

Пакет проверки подлинности

Когда приложение создается для использования отдельной учетной записи B2C (IndividualB2C), оно автоматически получает ссылку на пакет для библиотеки проверки подлинности Майкрософт (Microsoft.Authentication.WebAssembly.Msal). В пакете содержится набор примитивов, которые помогают приложению проверять подлинность пользователей и получать маркеры для вызова защищенных API.

При добавлении проверки подлинности в приложение вручную добавьте пакет Microsoft.Authentication.WebAssembly.Msal в приложение.

Примечание.

Рекомендации по добавлению пакетов в приложения .NET см. в разделе Способы установки пакетов NuGet в статье Рабочий процесс использования пакета (документация по NuGet). Проверьте правильность версий пакета на сайте NuGet.org.

Пакет Microsoft.Authentication.WebAssembly.Msal транзитивно добавляет пакет Microsoft.AspNetCore.Components.WebAssembly.Authentication в приложение.

Поддержка службы проверки подлинности

Поддержка проверки подлинности пользователей регистрируется в контейнере службы с помощью метода расширения AddMsalAuthentication, предоставляемого в пакете Microsoft.Authentication.WebAssembly.Msal. Этот метод настраивает все службы, необходимые для взаимодействия приложения с поставщиком Identity (IP).

В файле Program:

builder.Services.AddMsalAuthentication(options =>
{
    builder.Configuration.Bind("AzureAdB2C", options.ProviderOptions.Authentication);
});

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

Конфигурация предоставлена в файле wwwroot/appsettings.json:

{
  "AzureAdB2C": {
    "Authority": "{AAD B2C INSTANCE}{TENANT DOMAIN}/{SIGN UP OR SIGN IN POLICY}",
    "ClientId": "{CLIENT ID}",
    "ValidateAuthority": false
  }
}

В предыдущей конфигурации {AAD B2C INSTANCE} включает косую черту в конце.

Пример:

{
  "AzureAdB2C": {
    "Authority": "https://contoso.b2clogin.com/contoso.onmicrosoft.com/B2C_1_signupsignin1",
    "ClientId": "41451fa7-82d9-4673-8fa5-69eff5a761fd",
    "ValidateAuthority": false
  }
}

Области маркеров доступа

Шаблон Blazor WebAssembly не обеспечивает автоматическую настройку приложения для запроса маркера доступа для защищенного API. Чтобы настроить маркер доступа как часть потока входа, добавьте область в области маркера доступа по умолчанию MsalProviderOptions:

builder.Services.AddMsalAuthentication(options =>
{
    ...
    options.ProviderOptions.DefaultAccessTokenScopes.Add("{SCOPE URI}");
});

Укажите дополнительные области с помощью AdditionalScopesToConsent:

options.ProviderOptions.AdditionalScopesToConsent.Add("{ADDITIONAL SCOPE URI}");

Примечание.

AdditionalScopesToConsent Не удается подготовить делегированные разрешения пользователя для Microsoft Graph с помощью пользовательского интерфейса согласия идентификатора Microsoft Entra ID, когда пользователь сначала использует приложение, зарегистрированное в Microsoft Azure. Дополнительные сведения см. в статье Использование API Graph с ASP.NET Core Blazor WebAssembly.

Дополнительные сведения см. в следующих разделах статьи Дополнительные сценарии:

Режим входа

По умолчанию платформа использует режим входа в систему и возвращается в режим перенаправления входа, если не удается открыть всплывающее окно. Настройте MSAL для использования режима перенаправления входа, задав для свойства LoginModeMsalProviderOptions значение redirect.

builder.Services.AddMsalAuthentication(options =>
{
    ...
    options.ProviderOptions.LoginMode = "redirect";
});

Параметр по умолчанию — popupи строковое значение не учитывает регистр.

Файл импорта

Пространство имен Microsoft.AspNetCore.Components.Authorization становится доступным для всего приложения с помощью файла _Imports.razor:

@using System.Net.Http
@using System.Net.Http.Json
@using Microsoft.AspNetCore.Components.Authorization
@using Microsoft.AspNetCore.Components.Forms
@using Microsoft.AspNetCore.Components.Routing
@using Microsoft.AspNetCore.Components.Web
@using Microsoft.AspNetCore.Components.Web.Virtualization
@using Microsoft.AspNetCore.Components.WebAssembly.Http
@using Microsoft.JSInterop
@using {APPLICATION ASSEMBLY}
@using {APPLICATION ASSEMBLY}.Shared

Страница индексации

Страница индекса (wwwroot/index.html) содержит сценарий, определяющий AuthenticationService в JavaScript. AuthenticationService обрабатывает низкоуровневые сведения о протоколе OIDC. Приложение внутренне вызывает методы, определенные в сценарии для выполнения операций проверки подлинности.

<script src="_content/Microsoft.Authentication.WebAssembly.Msal/AuthenticationService.js"></script>

Компонент приложения

Компонент App (App.razor) аналогичен компоненту App, который находится в приложениях Blazor Server:

  • Компонент AuthorizeRouteView гарантирует, что текущий пользователь имеет право доступа к определенной странице или иным образом работать с компонентом RedirectToLogin.
  • Компонент RedirectToLogin управляет перенаправлением неавторизованных пользователей на страницу входа.
  • Компонент CascadingAuthenticationState управляет предоставлением AuthenticationState остальным приложениям.
  • Компонент AuthorizeRouteView гарантирует, что текущий пользователь имеет право доступа к определенной странице или иным образом работать с компонентом RedirectToLogin.
  • Компонент RedirectToLogin управляет перенаправлением неавторизованных пользователей на страницу входа.

Из-за различий в платформе между выпусками ASP.NET Core в этом разделе отсутствует разметка Razor для компонента App (App.razor). Чтобы изучить разметку этого компонента для конкретного выпуска, используйте один из следующих подходов:

  • создайте приложение, подготовленное для проверки подлинности, на основе шаблона проекта по умолчанию Blazor WebAssembly для версии ASP.NET Core, которую предполагается использовать. Изучите компонент App (App.razor) в созданном приложении;

  • изучите компонент App (App.razor) в справочных материалах. Выберите версию из селектора ветви и найдите компонент в ProjectTemplates папке репозитория, так как он перемещен на протяжении многих лет.

    Примечание.

    По ссылкам в документации на справочные материалы по .NET обычно загружается ветвь репозитория по умолчанию, которая представляет текущую разработку для следующего выпуска .NET. Чтобы выбрать тег для определенного выпуска, используйте раскрывающийся список Switch branches or tags (Переключение ветвей или тегов). Дополнительные сведения см. в статье Выбор тега версии исходного кода ASP.NET Core (dotnet/AspNetCore.Docs #26205).

Компонент RedirectToLogin

Компонент RedirectToLogin (RedirectToLogin.razor):

  • управляет перенаправлением неавторизованных пользователей на страницу входа.
  • Текущий URL-адрес, который пользователь пытается получить доступ, сохраняется таким образом, чтобы его можно было вернуть на ту страницу, если проверка подлинности выполнена успешно:
    • Состояние журнала навигации в ASP.NET Core в .NET 7 или более поздней версии.
    • Строка запроса в ASP.NET Core в .NET 6 или более ранней версии.

Изучите компонент RedirectToLogin в справочных материалах. Расположение компонента изменилось с течением времени, поэтому используйте средства поиска GitHub для поиска компонента.

Примечание.

По ссылкам в документации на справочные материалы по .NET обычно загружается ветвь репозитория по умолчанию, которая представляет текущую разработку для следующего выпуска .NET. Чтобы выбрать тег для определенного выпуска, используйте раскрывающийся список Switch branches or tags (Переключение ветвей или тегов). Дополнительные сведения см. в статье Выбор тега версии исходного кода ASP.NET Core (dotnet/AspNetCore.Docs #26205).

Компонент LoginDisplay

Компонент LoginDisplay (LoginDisplay.razor) отображается в компоненте MainLayout (MainLayout.razor) и управляет следующими поведениями.

  • Для прошедших проверку подлинности пользователей:
    • Отображает имя текущего пользователя.
    • Отображает ссылку на страницу профиля пользователя в ASP.NET Core Identity.
    • отображает кнопку для выхода из приложения.
  • Для анонимных пользователей:
    • Предоставляет возможность регистрации.
    • Предоставляет возможность входа в систему.

Из-за различий в платформе между выпусками ASP.NET Core в этом разделе отсутствует разметка Razor для компонента LoginDisplay. Чтобы изучить разметку этого компонента для конкретного выпуска, используйте один из следующих подходов:

  • создайте приложение, подготовленное для проверки подлинности, на основе шаблона проекта по умолчанию Blazor WebAssembly для версии ASP.NET Core, которую предполагается использовать. Изучите компонент LoginDisplay в созданном приложении.

  • Изучите компонент LoginDisplay в справочных материалах. Расположение компонента изменилось с течением времени, поэтому используйте средства поиска GitHub для поиска компонента. В качестве шаблонного содержимого используется Hosted со значением true.

    Примечание.

    По ссылкам в документации на справочные материалы по .NET обычно загружается ветвь репозитория по умолчанию, которая представляет текущую разработку для следующего выпуска .NET. Чтобы выбрать тег для определенного выпуска, используйте раскрывающийся список Switch branches or tags (Переключение ветвей или тегов). Дополнительные сведения см. в статье Выбор тега версии исходного кода ASP.NET Core (dotnet/AspNetCore.Docs #26205).

Компонент проверки подлинности

Страница, созданная компонентом Authentication (Pages/Authentication.razor), определяет маршруты, необходимые для обработки различных этапов проверки подлинности.

Компонент RemoteAuthenticatorView:

@page "/authentication/{action}"
@using Microsoft.AspNetCore.Components.WebAssembly.Authentication

<RemoteAuthenticatorView Action="Action" />

@code {
    [Parameter]
    public string? Action { get; set; }
}

Примечание.

В ASP.NET Core в .NET 6 или более поздней версии поддерживается статический анализ со значением NULL и компилятора .NET. До выпуска ASP.NET Core в .NET 6 string тип отображается без обозначения типа NULL (?).

Пользовательские политики

Библиотека проверки подлинности Майкрософт (Microsoft.Authentication.WebAssembly.Msalпакет NuGet) не поддерживает пользовательские политики AAD B2C по умолчанию.

Устранение неполадок

Ведение журнала

Чтобы включить ведение журнала отладки или трассировки для Blazor WebAssembly проверки подлинности, см. раздел Blazor ведения журнала проверки подлинности на стороне клиента ASP.NET Core с селектором версий статьи, установленным для ASP.NET Core 7.0 или более поздней версии.

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

  • Неправильная настройка приложения или поставщика Identity (IP)

    Наиболее частые ошибки вызваны неправильной настройкой. Ниже приводятся несколько примеров.

    • В зависимости от требований сценария, отсутствующие или неправильные элементы, такие как центр сертификации, экземпляр, идентификатор арендатора, домен арендатора, идентификатор клиента или URI перенаправления, не позволяют приложению осуществлять проверку подлинности клиентов.
    • Неверные область запросов не позволяют клиентам получать доступ к конечным точкам веб-API сервера.
    • Неправильные или отсутствующие разрешения API сервера не позволяют клиентам получить доступ к конечным точкам веб-API сервера.
    • Запуск приложения на порте, отличном от настроенного в URI перенаправления регистрации приложения IP-адреса. Обратите внимание, что порт не требуется для идентификатора Microsoft Entra и приложения, работающего на localhost адресе тестирования разработки, но конфигурация порта приложения и порт, на котором выполняется приложение, должно соответствовать не-адресамlocalhost .

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

    Если конфигурация верна, выполните приведенные ниже действия.

    • Проанализируйте журналы приложений.

    • Изучите трафик между клиентским приложением и серверным приложением или приложением поставщика удостоверений с помощью инструментов разработчика браузера. Зачастую точное сообщение об ошибке или сообщение с указанием на то, что вызывает проблему, возвращается клиенту с помощью серверного приложения или приложения поставщика удостоверений после выполнения запроса. Руководство по инструментам разработчика можно найти в следующих статьях:

    • Для выпусков, Blazor в JSкоторых используется веб-токен ON (JWT), декодирует содержимое маркера, используемого для проверки подлинности клиента или доступа к веб-API сервера в зависимости от места возникновения проблемы. Дополнительные сведения о проверке содержимого ON Web Token (JWT) см. в JSэтом разделе.

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

    Указанные выше форумы не принадлежат корпорации Майкрософт и не управляются ею.

    Чтобы сообщить об ошибках с воспроизведением платформы, которые не связаны с безопасностью и конфиденциальностью, откройте запрос с единицей продукта ASP.NET Core. Не открывайте запрос с единицей продукта, пока вы тщательно не изучите причину проблемы и не попытаетесь решить ее самостоятельно или с помощью сообщества на общедоступном форуме поддержки. Единица продукта не способна устранять неполадки отдельных приложений, которые не работают из-за неправильной конфигурации или вариантов использования с участием сторонних служб. Если отчет является конфиденциальным или конфиденциальным в природе или описывает потенциальный недостаток безопасности в продукте, который злоумышленники могут использовать, см. статью "Отчеты о проблемах безопасности и ошибках" (dotnet/aspnetcoreрепозиторий GitHub).

  • Несанкционированный клиент для ME-ID

    info: сбой авторизации Microsoft.AspNetCore.Authorization.DefaultAuthorizationService[2]. Эти требования не выполнены: DenyAnonymousAuthorizationRequirement: требуется прошедший проверку подлинности пользователь.

    Ошибка обратного вызова входа из ME-ID:

    • Ошибка: unauthorized_client
    • Описание: AADB2C90058: The provided application is not configured to allow public clients.

    Чтобы устранить эту ошибку, сделайте следующее:

    1. На портале Azure перейдите к манифесту приложения.
    2. Задайте для атрибута allowPublicClient значение null или true.

Файлы Cookie и данные сайта

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

  • файлы cookie входа пользователя;
  • файлы cookie приложения;
  • кэшированные и сохраненные данные сайта.

Один из подходов, позволяющих предотвратить влияние устаревших файлов cookie и данных сайта на тестирование и устранение неполадок, заключается в следующем.

  • Настройка браузера
    • Для тестирования используйте браузер, в котором можно настроить удаление всех файлов cookie и данных сайта при каждом закрытии браузера.
    • Убедитесь, что при любых изменениях в приложении, в данных тестового пользователя или в конфигурации поставщика закрытие браузера выполняется вручную или интегрированной средой разработки.
  • Используйте пользовательскую команду, чтобы открыть браузер в режиме InPrivate или Incognito в Visual Studio:
    • Откройте диалоговое окно Просмотр с помощью, которое можно выбрать с помощью кнопки Запустить в Visual Studio.
    • Нажмите кнопку Добавить.
    • Укажите путь к браузеру в поле Программа. Следующие пути к исполняемым файлам являются типичными расположениями установки для Windows 10. Если браузер установлен в другом расположении или вы используете операционную систему, отличную от Windows 10, укажите путь к исполняемому файлу браузера.
      • Microsoft Edge: C:\Program Files (x86)\Microsoft\Edge\Application\msedge.exe
      • Google Chrome: C:\Program Files (x86)\Google\Chrome\Application\chrome.exe
      • Mozilla Firefox: C:\Program Files\Mozilla Firefox\firefox.exe
    • В поле "Аргументы" укажите параметр командной строки, который браузер использует для открытия в режиме InPrivate или Incognito. Для некоторых браузеров требуется URL-адрес приложения.
      • Microsoft Edge: используйте -inprivate.
      • Google Chrome: используйте --incognito --new-window {URL}, где заполнитель {URL} является URL-адресом для открытия (например, https://localhost:5001).
      • Mozilla Firefox: используйте -private -url {URL}, где заполнитель {URL} является URL-адресом для открытия (например, https://localhost:5001).
    • Введите имя в поле Понятное имя. Например, Firefox Auth Testing.
    • Выберите кнопку ОК.
    • Чтобы не выбирать профиль браузера для каждой операции тестирования с помощью приложения, задайте профиль по умолчанию с помощью кнопки По умолчанию.
    • Убедитесь, что при любых изменениях в приложении, в данных тестового пользователя или в конфигурации поставщика закрытие браузера выполняется интегрированной средой разработки.

Обновление приложений

Приложения-функции могут перестать работать сразу после обновления пакета SDK для .NET Core на компьютере разработки или обновления версии пакетов в самом приложении. В некоторых случаях в результате важного обновления несогласованные версии пакетов могут привести к нарушению работы приложения. Большинство этих проблем можно исправить следующим образом:

  1. Очистите кэши пакетов NuGet локальных систем, выполнив команду dotnet nuget locals all --clear из командной оболочки.
  2. Удалите папки bin и obj проекта.
  3. Восстановите и перестройте проект.
  4. Удалите все файлы из папки развертывания на сервере, прежде чем повторно развернуть приложение.

Примечание.

Использование версий пакета, несовместимых с требуемой платформой приложения, не поддерживается. Дополнительные сведения о пакете см. на странице коллекций NuGet или обозревателя пакетов FuGet.

Server Запуск приложения

При тестировании и устранении неполадок в размещенном решенииBlazor WebAssembly убедитесь, что вы используете приложение из проекта Server.

Проверка пользователя

Следующий User компонент можно использовать непосредственно в приложениях или служить основой для дальнейшей настройки.

User.razor:

@page "/user"
@attribute [Authorize]
@using System.Text.Json
@using System.Security.Claims
@inject IAccessTokenProvider AuthorizationService

<h1>@AuthenticatedUser?.Identity?.Name</h1>

<h2>Claims</h2>

@foreach (var claim in AuthenticatedUser?.Claims ?? Array.Empty<Claim>())
{
    <p class="claim">@(claim.Type): @claim.Value</p>
}

<h2>Access token</h2>

<p id="access-token">@AccessToken?.Value</p>

<h2>Access token claims</h2>

@foreach (var claim in GetAccessTokenClaims())
{
    <p>@(claim.Key): @claim.Value.ToString()</p>
}

@if (AccessToken != null)
{
    <h2>Access token expires</h2>

    <p>Current time: <span id="current-time">@DateTimeOffset.Now</span></p>
    <p id="access-token-expires">@AccessToken.Expires</p>

    <h2>Access token granted scopes (as reported by the API)</h2>

    @foreach (var scope in AccessToken.GrantedScopes)
    {
        <p>Scope: @scope</p>
    }
}

@code {
    [CascadingParameter]
    private Task<AuthenticationState> AuthenticationState { get; set; }

    public ClaimsPrincipal AuthenticatedUser { get; set; }
    public AccessToken AccessToken { get; set; }

    protected override async Task OnInitializedAsync()
    {
        await base.OnInitializedAsync();
        var state = await AuthenticationState;
        var accessTokenResult = await AuthorizationService.RequestAccessToken();

        if (!accessTokenResult.TryGetToken(out var token))
        {
            throw new InvalidOperationException(
                "Failed to provision the access token.");
        }

        AccessToken = token;

        AuthenticatedUser = state.User;
    }

    protected IDictionary<string, object> GetAccessTokenClaims()
    {
        if (AccessToken == null)
        {
            return new Dictionary<string, object>();
        }

        // header.payload.signature
        var payload = AccessToken.Value.Split(".")[1];
        var base64Payload = payload.Replace('-', '+').Replace('_', '/')
            .PadRight(payload.Length + (4 - payload.Length % 4) % 4, '=');

        return JsonSerializer.Deserialize<IDictionary<string, object>>(
            Convert.FromBase64String(base64Payload));
    }
}

Проверка содержимого JSON Web Token (JWT)

Чтобы декодировать JSON Web Token (JWT), используйте средство jwt.ms (Майкрософт). Значения в пользовательском интерфейсе остаются в браузере.

Пример закодированного JWT (сокращено для отображения):

eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiIsImtpZCI6Ilg1ZVhrNHh5b2pORnVtMWtsMll0djhkbE5QNC1j ... bQdHBHGcQQRbW7Wmo6SWYG4V_bU55Ug_PW4pLPr20tTS8Ct7_uwy9DWrzCMzpD-EiwT5IjXwlGX3IXVjHIlX50IVIydBoPQtadvT7saKo1G5Jmutgq41o-dmz6-yBMKV2_nXA25Q

Пример JWT, декодированного инструментом для приложения, которое проходит проверку подлинности в Azure AAD B2C:

{
  "typ": "JWT",
  "alg": "RS256",
  "kid": "X5eXk4xyojNFum1kl2Ytv8dlNP4-c57dO6QGTVBwaNk"
}.{
  "exp": 1610059429,
  "nbf": 1610055829,
  "ver": "1.0",
  "iss": "https://mysiteb2c.b2clogin.com/5cc15ea8-a296-4aa3-97e4-226dcc9ad298/v2.0/",
  "sub": "5ee963fb-24d6-4d72-a1b6-889c6e2c7438",
  "aud": "70bde375-fce3-4b82-984a-b247d823a03f",
  "nonce": "b2641f54-8dc4-42ca-97ea-7f12ff4af871",
  "iat": 1610055829,
  "auth_time": 1610055822,
  "idp": "idp.com",
  "tfp": "B2C_1_signupsignin"
}.[Signature]

Дополнительные ресурсы