Защита ASP.NET Core Blazor WebAssembly

Примечание.

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

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

Эта версия ASP.NET Core больше не поддерживается. Дополнительные сведения см. в политике поддержки .NET и .NET Core. В текущей версии см. версию .NET 10 этой статьи.

Защита приложений Blazor WebAssembly обеспечивается аналогично защите одностраничных приложений (SPA). Существует несколько подходов к аутентификации пользователей в одностраничных приложениях (SPA), но наиболее распространённым и полным является использование реализации, основанной на протоколе OAuth 2.0, например OpenID Connect (OIDC).

Документация Blazor WebAssembly по безопасности в основном посвящена выполнению задач проверки подлинности и авторизации пользователей. Общие понятия OAuth 2.0/OIDC см. в разделе "Дополнительные ресурсы" статьи "Дополнительные ресурсы".

Безопасность конфиденциальных данных и учетных данных на стороне клиента или SPA

Blazor WebAssembly База кода .NET/C# приложения обслуживается клиентами, а код приложения не может быть защищен от проверки и изменения пользователями. Никогда не помещайте конфиденциальные данные в приложение Blazor WebAssembly, например секреты приложений, строки подключения, пароли, ключи безопасности и частный код .NET/C#.

Следующие технологии полезны для хранения конфиденциальных данных, которые можно использовать вместе в одном приложении для разделения обязанностей по хранению данных среди Development, Staging и Production сред.

  • средство диспетчера секретов: используется только в локальной системе разработки.
  • Azure Key Vault: можно использовать для локально работающих приложений в Development среде и для Staging/Production развертываний.

Примеры предыдущих подходов см. в разделе Подтверждение учетной записи и восстановление паролей в ASP.NET Core Blazor WebAssembly с ASP.NET Core Identity.

Запросы веб-API

Чтобы защитить код и данные .NET/C#, используйте функции ASP.NET Core Data Protection с серверным веб-API на основе ASP.NET Core. Клиентское Blazor WebAssembly приложение вызывает серверный веб-API для безопасных функций приложений и обработки данных. Дополнительные сведения см. в статье Вызов веб-API из ASP.NET Core Blazor приложения и статьи и примеры в этом узле документации.

Blazor WebAssembly приложения часто не могут осуществлять прямые вызовы к веб-API с других источников вследствие безопасностисовместного использования ресурсов между источниками (CORS). Обычное исключение выглядит следующим образом:

Доступ к получению по адресу "{URL}" из источника "https://localhost:{PORT}' заблокирован политикой CORS: в запрошенном ресурсе отсутствует заголовок Access-Control-Allow-Origin. Если непрозрачный ответ служит вашим потребностям, задайте для режима запроса значение no-cors, чтобы получить ресурс с отключенным CORS.

Даже если вы вызываете SetBrowserRequestMode с полем BrowserRequestModeNoCors (1) с целью обхода предыдущего исключения, запрос обычно завершается ошибкой из-за ограничений CORS в источнике веб-API, например, ограничение, которое разрешает вызовы только из определенных источников, или ограничение, которое предотвращает JavaScript-запросы fetch из браузера. Единственным способом успешного выполнения таких вызовов является веб-API, который вы вызываете, чтобы разрешить источнику вызывать его источник с правильной конфигурацией CORS. Большинство внешних веб-API не позволяют настраивать политики CORS. Чтобы справиться с этим ограничением, выполните любую из следующих стратегий:

  • Поддерживайте ваш собственный серверный веб-API на ASP.NET Core. Приложение на стороне клиента Blazor WebAssembly вызывает ваш веб-API на стороне сервера, и веб-API отправляет запрос от серверного кода на C# (а не из браузера) во внешний веб-API с правильными заголовками CORS, возвращая результат в приложение на стороне клиента Blazor WebAssembly.

  • Используйте службу прокси-сервера для прокси-запроса из клиентского приложения Blazor WebAssembly в внешний веб-API. Прокси-служба использует серверное приложение для выполнения запроса от имени клиента и возвращает результат после успешного вызова. В следующем примере на основе ПРОКСИ-сервера CORS CloudFlare заполнитель {REQUEST URI} является универсальным кодом ресурса (URI запроса):

    @using System.Net
    @inject IHttpClientFactory ClientFactory
    
    ...
    
    @code {
        public async Task CallApi()
        {
            var client = ClientFactory.CreateClient();
    
            var urlEncodedRequestUri = WebUtility.UrlEncode("{REQUEST URI}");
    
            using var request = new HttpRequestMessage(HttpMethod.Get, 
                $"https://corsproxy.io/?{urlEncodedRequestUri}");
    
            using var response = await client.SendAsync(request);
    
            ...
        }
    }
    

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

Blazor WebAssembly поддерживает проверку подлинности и авторизацию приложений с помощью OIDC через библиотеку Microsoft.AspNetCore.Components.WebAssembly.Authentication с помощью платформы удостоверений Майкрософт. Библиотека предоставляет набор примитивов для бесшовной аутентификации с серверной частью ASP.NET Core. Библиотеку можно использовать для проверки подлинности любого стороннего поставщика Identity (IP), который поддерживает OIDC (их называют поставщиками OpenID (OP)).

Поддержка проверки подлинности в Blazor WebAssembly библиотеке (Authentication.js) основана на библиотеке проверки подлинности Майкрософт (MSAL, msal.js), которая используется для обработки сведений о базовом протоколе проверки подлинности. Библиотека Blazor WebAssembly поддерживает только поток авторизации с кодом авторизации и подтверждением ключа (PKCE). Неявное предоставление не поддерживается.

Существуют и другие варианты аутентификации SPA, например, использование файлов cookie SameSite. Однако в технической архитектуре Blazor WebAssembly OAuth и OIDC используются как предпочтительный вариант аутентификации в приложениях Blazor WebAssembly. Аутентификация на основе токенов с использованием JSON Web Tokens (JWTs) была выбрана вместо аутентификации на основе cookie по функциональным причинам и соображениям безопасности:

  • Использование протокола на основе маркеров обеспечивает меньше уязвимостей, так как маркеры не отправляются во всех запросах.
  • Токены явно отправляются на сервер, поэтому серверные конечные точки не требуют защиты от межсайтовой подделки запроса (CSRF). Это позволяет размещать приложения Blazor WebAssembly параллельно с приложениями MVC или Razor Pages.
  • Разрешения токенов более узкие, чем разрешения файлов cookie. Например, токены нельзя использовать для управления учетной записью пользователя или изменения пароля пользователя, если такие функции не реализованы явным образом.
  • Токены имеют короткий срок действия — один час, что сокращает временное окно для атаки. Токены можно отозвать в любое время.
  • Самодостаточные JWT-токены дают клиенту и серверу гарантии в отношении процесса аутентификации. Например, на клиенте есть средства для обнаружения и проверки допустимости получаемых токенов, а также подтверждения их выпуска в рамках данного процесса проверки подлинности. Если третья сторона пытается изменить токен в ходе процесса проверки подлинности, клиент может обнаружить измененный токен и не использовать его.
  • Токены с OAuth и OIDC обеспечивают безопасность приложения вне зависимости от поведения агента пользователя.
  • Протоколы на основе токенов, такие как OAuth и OIDC, позволяют выполнять проверку подлинности и авторизацию пользователей в автономных Blazor приложениях Webassembly с одинаковым набором характеристик безопасности.
  • Использование протокола на основе маркеров обеспечивает меньше уязвимостей, так как маркеры не отправляются во всех запросах.
  • Токены явно отправляются на сервер, поэтому серверные конечные точки не требуют защиты от межсайтовой подделки запроса (CSRF). Это позволяет размещать приложения Blazor WebAssembly параллельно с приложениями MVC или Razor Pages.
  • Разрешения токенов более узкие, чем разрешения файлов cookie. Например, токены нельзя использовать для управления учетной записью пользователя или изменения пароля пользователя, если такие функции не реализованы явным образом.
  • Токены имеют короткий срок действия — один час, что сокращает временное окно для атаки. Токены можно отозвать в любое время.
  • Самодостаточные JWT-токены дают клиенту и серверу гарантии в отношении процесса аутентификации. Например, на клиенте есть средства для обнаружения и проверки допустимости получаемых токенов, а также подтверждения их выпуска в рамках данного процесса проверки подлинности. Если третья сторона пытается изменить токен в ходе процесса проверки подлинности, клиент может обнаружить измененный токен и не использовать его.
  • Токены с OAuth и OIDC обеспечивают безопасность приложения вне зависимости от поведения агента пользователя.
  • Протоколы на основе токенов, такие как OAuth и OIDC, позволяют выполнять проверку подлинности и авторизацию пользователей размещенных Blazor WebAssembly клиентов решений и автономных Blazor приложений Webassembly с одинаковым набором характеристик безопасности.

Внимание

Для версий ASP.NET Core, которые используют Duende Identity Server в шаблонах проектов Blazor, Duende Software может потребовать от вас уплаты лицензионного сбора за использование Duende Identity Server в рабочей среде. Дополнительные сведения см. в статье "Миграция из ASP.NET Core в .NET 5 в .NET 6".

Процесс проверки подлинности с использованием OIDC

Библиотека Microsoft.AspNetCore.Components.WebAssembly.Authentication предлагает несколько примитивов для реализации проверки подлинности и авторизации с помощью OIDC. В общих чертах проверка подлинности работает следующим образом.

  • Когда анонимный пользователь выбирает кнопку входа или запрашивает Razor компонент или страницу с [Authorize] примененным атрибутом , пользователь перенаправляется на страницу входа приложения (/authentication/login).
  • На странице входа библиотека проверки подлинности готовится к перенаправлению на конечную точку авторизации. Конечная точка авторизации находится вне приложения Blazor WebAssembly и может размещаться в отдельном источнике. Конечная точка определяет, прошел ли пользователь проверку подлинности, и выдает в ответ один или несколько токенов. Библиотека аутентификации предоставляет функцию обратного вызова для входа, чтобы получать ответ аутентификации.
    • Если пользователь не прошел проверку подлинности, он перенаправляется в базовую систему проверки подлинности. Обычно это ASP.NET Core Identity.
    • Если пользователь уже прошел проверку подлинности, конечная точка авторизации создает соответствующие токены и перенаправляет браузер назад в конечную точку обратного вызова входа (/authentication/login-callback).
  • Когда приложение Blazor WebAssembly загружает конечную точку обратного вызова входа (/authentication/login-callback), происходит обработка ответа проверки подлинности.
    • Если процесс проверки подлинности завершается успешно, пользователь проходит проверку подлинности и при необходимости перенаправляется по запрошенному исходному защищенному URL-адресу.
    • Если процесс аутентификации завершается ошибкой по какой-либо причине, пользователь перенаправляется на страницу ошибки входа (/authentication/login-failed), где отображается сообщение об ошибке.

Компонент Authentication

Компонент Authentication (Authentication.razor) обрабатывает операции удаленной проверки подлинности и позволяет приложению выполнять следующие действия:

  • Настройте маршруты приложения для состояний аутентификации.
  • задавать содержимое пользовательского интерфейса для различных состояний проверки подлинности;
  • управлять состоянием проверки подлинности.

Действия по проверке подлинности, такие как регистрация или вход пользователя в систему, передаются в компонент Blazor платформы RemoteAuthenticatorViewCore<TAuthenticationState>, который сохраняет и контролирует состояние в операциях проверки подлинности.

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

Авторизация

В приложениях Blazor WebAssembly авторизацию можно обойти, так как пользователь может изменять весь код на стороне клиента. То же самое верно для всех клиентских технологий разработки приложений, включая JavaScript-фреймворки для одностраничных приложений или нативные приложения для любых операционных систем.

Всегда выполняйте проверки авторизации на стороне сервера в конечных точках API, к которым обращается клиентское приложение.

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

Blazor WebAssembly предоставляет методы для добавления и получения дополнительных параметров базовой библиотеки проверки подлинности для проведения удаленных операций проверки подлинности с внешними поставщиками удостоверений.

Чтобы передавать дополнительные параметры, NavigationManager поддерживает передачу и получение состояния записи истории при внешнем изменении адреса. Дополнительные сведения см. на следующих ресурсах:

Состояние, хранящееся API журнала, обеспечивает следующие преимущества для удаленной проверки подлинности:

  • Состояние, переданное защищенной конечной точке приложения, привязано к навигации, выполняемой для проверки подлинности пользователя в конечной точке authentication/login.
  • Дополнительная работа по кодированию и декодированию данных исключается.
  • Уязвимости сокращаются. В отличие от использования строки запроса для хранения состояния навигации, навигация верхнего уровня или влияние из другого источника не может задать состояние, сохраненное API журнала.
  • Запись истории заменяется после успешной аутентификации, поэтому состояние, связанное с записью истории, удаляется и не требует очистки.

InteractiveRequestOptions представляет запрос к поставщику удостоверений для входа в систему или получения маркера доступа.

NavigationManagerExtensions предоставляет метод NavigateToLogin для операции входа и NavigateToLogout для операции выхода. Методы вызывают NavigationManager.NavigateTo, устанавливая состояние записи журнала с помощью переданного InteractiveRequestOptions или нового экземпляра InteractiveRequestOptions, созданного методом, в следующих случаях:

  • Вход пользователя (InteractionType.SignIn) с текущим унифицированным идентификатором ресурса (URI) для URL-адреса возврата.
  • Выход пользователя из системы (InteractionType.SignOut) с URL-адресом возврата.

Следующие сценарии проверки подлинности рассматриваются в статье ASP.NET Core: Blazor WebAssembly — дополнительные сценарии безопасности:

  • Настройка процесса входа
  • Выход с настраиваемым URL-адресом возврата
  • Настроить параметры перед интерактивным получением токена
  • Настройте параметры при использовании IAccessTokenProvider
  • Получение пути входа из параметров проверки подлинности

Требование авторизации для всего приложения

Примените атрибут [Authorize] к каждому компоненту приложения, используя Razor из следующих подходов (документация по API):

  • В файле импорта приложения добавьте @using директиву для Microsoft.AspNetCore.Authorization пространства имен и @attribute директиву для атрибута [Authorize].

    _Imports.razor:

    @using Microsoft.AspNetCore.Authorization
    @attribute [Authorize]
    

    Разрешить анонимный доступ к компоненту Authentication, чтобы обеспечить перенаправление к поставщику идентификации. Добавьте следующий код Razor в компонент Authentication в его директиве @page.

    Authentication.razor:

    @using Microsoft.AspNetCore.Components.WebAssembly.Authentication
    @attribute [AllowAnonymous]
    
  • Добавьте атрибут к каждому Razor компоненту в директиве @page :

    @using Microsoft.AspNetCore.Authorization
    @attribute [Authorize]
    

Примечание.

Задание политики AuthorizationOptions.FallbackPolicy с использованием RequireAuthenticatedUserне поддерживается.

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

Некоторые статьи, приведенные в этом обзоре , относятся к Blazor сценариям размещения, которые включают два или более приложений. Автономное Blazor WebAssembly приложение использует веб-API с прошедшими проверку подлинности пользователями для доступа к ресурсам сервера и данным, предоставляемым серверным приложением.

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

Некоторые статьи, описанные в этом обзоре , относятся к следующим Blazor сценариям размещения, которые включают два или более приложений:

  • Размещённое Blazor WebAssembly решение, состоящее из двух приложений: клиентского Blazor WebAssembly приложения и серверного хост-приложения ASP.NET Core. Пользователи, прошедшие проверку подлинности, получают доступ к ресурсам сервера и данным клиентского приложения, предоставляемым серверным приложением.
  • Автономное Blazor WebAssembly приложение, использующее веб-API с прошедшими проверку подлинности пользователями для доступа к ресурсам сервера и данным, предоставляемым серверным приложением. Этот сценарий похож на использование размещённого решения Blazor WebAssembly, но в этом случае клиентское приложение не размещается серверным приложением.

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

токены обновления

Хотя маркеры обновления не могут быть защищены в Blazor WebAssembly приложениях, их можно использовать, если вы реализуете их с соответствующими стратегиями безопасности.

Для автономных Blazor WebAssembly приложений в ASP.NET Core в .NET 6 или более поздней версии рекомендуется использовать следующее:

Для размещаемых Blazor WebAssembly решений маркеры обновления могут храниться и использоваться серверным приложением для доступа к сторонним API. Дополнительные сведения см. в статье Сценарии обеспечения дополнительной безопасности для ASP.NET Core Blazor WebAssembly.

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

Создание утверждений для пользователей

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

Для примера см. следующие ресурсы:

Поддержка предварительного рендеринга

Предварительная отрисовка не поддерживается для конечных точек проверки подлинности (сегмент пути /authentication/).

Предварительная отрисовка не поддерживается для конечных точек проверки подлинности (сегмент пути /authentication/).

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

Служба приложений Azure в Linux с сервером Identity

При развертывании в Службе приложений Azure в Linux с сервером Identity нужно указать издателя явно.

Дополнительные сведения см. в статье Использование Identity для защиты серверной части Web API для SPA.

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

Мы не рекомендуем использовать проверку подлинности Windows с Blazor WebAssembly или любым другим SPA-фреймворком. Мы рекомендуем использовать протоколы на основе токенов вместо аутентификации Windows, такие как OIDC с службы федерации Active Directory (AD FS) (ADFS).

Если проверка подлинности Windows используется с Blazor Webassembly или с любой другой платформой SPA, необходимо принять дополнительные меры для защиты приложения от маркеров подделки межсайтовых запросов (CSRF). Те же соображения, что относятся к файлам cookie, относятся и к аутентификации Windows, с той лишь разницей, что аутентификация Windows не предусматривает механизма, предотвращающего совместное использование контекста аутентификации между источниками. Приложения, использующие проверку подлинности Windows без дополнительной защиты от CSRF, должны быть по крайней мере ограничены интрасетью организации и не используются в открытом Интернете.

Дополнительные сведения см. на странице Предотвращение атак с использованием подделки межсайтовых запросов (XSRF/CSRF) в ASP.NET Core.

Защита концентратора SignalR

Чтобы защитить SignalR концентратор в проекте API сервера, примените [Authorize] атрибут к классу концентратора или к методам класса концентратора.

В клиентском проекте с предварительной отрисовкой, например в размещённом Blazor WebAssembly (ASP.NET Core в .NET 7 или более ранних версиях) или Blazor Web App (ASP.NET Core в .NET 8 или более поздних версиях), см. рекомендации в руководстве по ASP.NET Core BlazorSignalR.

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

@using Microsoft.AspNetCore.Components.WebAssembly.Authentication
@inject IAccessTokenProvider TokenProvider
@inject NavigationManager Navigation

...

var tokenResult = await TokenProvider.RequestAccessToken();

if (tokenResult.TryGetToken(out var token))
{
    hubConnection = new HubConnectionBuilder()
        .WithUrl(Navigation.ToAbsoluteUri("/chathub"), 
            options => { options.AccessTokenProvider = () => Task.FromResult(token?.Value); })
        .Build();

  ...
}

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

Этот раздел относится к приложениям Blazor WebAssembly в ASP.NET Core в .NET 7 или более поздней версии.

Чтобы включить ведение журнала отладки или трассировки, см. раздел Ведение журнала аутентификации (Blazor WebAssembly) в версии статьи Ведение журнала ASP.NET CoreBlazor для .NET 7 или более поздней версии.

Песочница WebAssembly

Песочница WebAssembly ограничивает доступ к среде системы, выполняющей код WebAssembly, включая доступ к подсистемам ввода-вывода, системным хранилищам и ресурсам и операционной системе. Изоляция между кодом WebAssembly и системой, выполняющей код, делает WebAssembly безопасной платформой кодирования для систем. Однако WebAssembly уязвим к атакам по побочным каналам на аппаратном уровне. Применяются обычные меры предосторожности и должная проверка при закупке оборудования и ограничении доступа к нему.

WebAssembly не принадлежит или поддерживается корпорацией Майкрософт.

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

Методические указания по внедрению

Статьи в этом обзоре содержат сведения о проверке подлинности пользователей в приложениях Blazor WebAssembly для конкретных поставщиков.

Автономные приложения Blazor WebAssembly:

Размещенные приложения Blazor WebAssembly:

Примечание.

Azure Active Directory B2C больше не доступна в качестве службы для новых клиентов с 1 мая 2025 г. Дополнительные сведения см. в статье Azure AD B2C: часто задаваемые вопросы и ответы.

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

Использование потока кода авторизации с PKCE

Платформа удостоверений Microsoft библиотеки аутентификации Microsoft для JavaScript (MSAL) версии 2.0 или более поздней предоставляет поддержку потока кода авторизации с ключом подтверждения для обмена кодом (PKCE) и совместного использования ресурсов между источниками (CORS) для одностраничных приложений, включая Blazor.

Корпорация Майкрософт не рекомендует использовать неявное предоставление.

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

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