Бөлісу құралы:


Безопасные приложения на стороне Blazor сервера ASP.NET Core

Примечание.

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

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

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

Внимание

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

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

В этой статье объясняется, как защитить серверные Blazor приложения как приложения ASP.NET Core.

Серверные Blazor приложения настраиваются для обеспечения безопасности таким же образом, как и ASP.NET приложения Core. Дополнительные сведения см. в статьях, посвященных обеспечению безопасности в ASP.NET Core.

Контекст проверки подлинности устанавливается только при запуске приложения, то есть когда приложение сначала подключается к WebSocket. Контекст проверки подлинности сохраняется в течение всего времени существования канала. Приложения периодически пересматривают состояние проверки подлинности пользователя каждые 30 минут.

Если приложение должно записывать пользователей для пользовательских служб или реагировать на обновления пользователя, см. дополнительные сценарии безопасности на стороне сервера ASP.NET CoreBlazor.

Blazor отличается от традиционных веб-приложений, отрисованных на сервере, которые делают новые HTTP-запросы с файлами cookie на каждой навигации по страницам. Проверка подлинности выполняется во время событий навигации. Однако файлы cookie не участвуют. Файлы cookie отправляются только при выполнении HTTP-запроса на сервер, что не происходит при переходе пользователя в Blazor приложение. Во время навигации состояние проверки подлинности пользователя проверяется в Blazor канале, которое можно обновить в любое время на сервере с помощью RevalidatingAuthenticationStateProvider абстракции.

Внимание

Реализация пользовательского элемента NavigationManager для проверки подлинности во время навигации не рекомендуется. Если приложение должно выполнить пользовательскую логику состояния проверки подлинности во время навигации, используйте пользовательскую AuthenticationStateProvider.

Примечание.

Примеры кода в этой статье используют типы ссылок, допускающие значение NULL (NRTs) и статический анализ состояния .NET компилятора NULL, которые поддерживаются в ASP.NET Core в .NET 6 или более поздней версии. При назначении ASP.NET Core 5.0 или более ранней версии удалите обозначение типа NULL (?) из примеров, приведенных в этой статье.

шаблон проекта;

Создайте серверное Blazor приложение, следуя инструкциям в статье "Инструментирование для ASP.NET Core Blazor".

Выбрав шаблон приложения на стороне сервера и настроив проект, выберите проверку подлинности приложения в разделе "Проверка подлинности".

  • Нет (по умолчанию): проверка подлинности отсутствует.
  • Отдельные учетные записи: учетные записи пользователей хранятся в приложении с помощью ASP.NET Core Identity.
  • Нет (по умолчанию): проверка подлинности отсутствует.
  • Отдельные учетные записи: учетные записи пользователей хранятся в приложении с помощью ASP.NET Core Identity.
  • Платформа Майкрософтidentity: дополнительные сведения см. в разделе ASP.NET Проверка подлинности и авторизация CoreBlazor.
  • Windows: используйте проверку подлинности Windows.

BlazorIdentity Пользовательский интерфейс (отдельные учетные записи)

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

Код Blazor Web App шаблонов Identity для базы данных SQL Server. Версия командной строки использует SQLite и включает базу данных SQLite для Identity.

Шаблон:

  • Поддерживает интерактивные сценарии отрисовки на стороне сервера (интерактивная служба SSR) и клиентских сценариев отрисовки (CSR) с прошедшими проверку подлинности пользователями.
  • Добавляет IdentityRazor компоненты и связанную логику для обычных задач проверки подлинности, таких как вход пользователей и выход. Компоненты Identity также поддерживают расширенные Identity функции, такие как подтверждение учетной записи и восстановление паролей и многофакторная проверка подлинности с помощью стороннего приложения. Обратите внимание, что Identity сами компоненты не поддерживают интерактивность.
  • IdentityДобавляет связанные пакеты и зависимости.
  • Ссылается на Identity пакеты в _Imports.razor.
  • Создает пользовательский класс пользователя Identity (ApplicationUser).
  • Создает и регистрирует EF Core контекст базы данных (ApplicationDbContext).
  • Настраивает маршрутизацию для встроенных Identity конечных точек.
  • Включает Identity проверку и бизнес-логику.

Чтобы проверить Blazor компоненты платформыIdentity, получите доступ к ним в Pages папке и Shared папках Account в шаблоне Blazor Web App проекта (источник ссылки).

При выборе режимов интерактивного веб-просмотра или интерактивного автоматического отрисовки сервер обрабатывает все запросы проверки подлинности и авторизации, а Identity компоненты отображаются статически на сервере в Blazor Web Appосновном проекте.

Платформа предоставляет настраиваемый AuthenticationStateProvider в проектах сервера и клиента (.Client) для потока состояния проверки подлинности пользователя в браузер. Серверный проект вызывает AddAuthenticationStateSerialization, а клиентский проект вызывает AddAuthenticationStateDeserialization. Проверка подлинности на сервере, а не клиент позволяет приложению получать доступ к состоянию проверки подлинности во время предварительной подготовки и до инициализации среды выполнения .NET WebAssembly. Пользовательские AuthenticationStateProvider реализации используют службу состояния сохраняемого компонента (PersistentComponentState) для сериализации состояния проверки подлинности в примечаниях HTML, а затем считывает ее обратно из WebAssembly для создания нового AuthenticationState экземпляра. Дополнительные сведения см. в Blazor Web App разделе "Управление состоянием проверки подлинности".

Только для решений интерактивного сервера (эталонный источник) — это серверная сторонаAuthenticationStateProvider, IdentityRevalidatingAuthenticationStateProvider которая обновляет метку безопасности для подключенного пользователя каждые 30 минут.

При выборе режимов интерактивного веб-просмотра или интерактивного автоматического отрисовки сервер обрабатывает все запросы проверки подлинности и авторизации, а Identity компоненты отображаются статически на сервере в Blazor Web Appосновном проекте. Шаблон проекта содержит класс (источник ссылки) в .Client проекте для синхронизации состояния проверки подлинности пользователя между сервером PersistentAuthenticationStateProvider и браузером. Класс представляет собой пользовательскую реализацию AuthenticationStateProvider. Поставщик использует службу состояния сохраняемого компонента (PersistentComponentState) для предварительной подготовки состояния проверки подлинности и сохранения его на странице.

В основном проекте Blazor Web Appпоставщика состояния проверки подлинности называется либоIdentityRevalidatingAuthenticationStateProvider (эталонный источник) (только решения для взаимодействия сервера), либо PersistingRevalidatingAuthenticationStateProvider (эталонный источник) (WebAssembly или автоматические интерактивные решения).

BlazorIdentityDbContext зависит от экземпляров, не созданных фабрикой, которая является преднамеренной, так как DbContext достаточно для компонентов шаблона Identity проекта для статического отображения без поддержки интерактивности.

Описание того, как глобальные режимы интерактивной отрисовки применяются к некомпонентамIdentity, одновременно применяя статический SSR для Identity компонентов, см. в разделе ASP.NET Режимы отрисовки CoreBlazor.

Дополнительные сведения о сохранении предопределенного состояния см. в разделе "Предварительная ASP.NET Основные Razor компоненты".

Дополнительные сведения об пользовательском BlazorIdentity интерфейсе и рекомендациях по интеграции внешних имен входа через социальные веб-сайты см. в статье "Новые возможности" identity в .NET 8.

Примечание.

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

Управление состоянием проверки подлинности в Blazor Web Apps

Этот раздел относится к Blazor Web Appследующим:

  • Отдельные учетные записи
  • Отрисовка на стороне клиента (CSR, взаимодействие на основе WebAssembly).

Поставщик состояния проверки подлинности на стороне клиента используется только внутри Blazor и не интегрирован с системой проверки подлинности ASP.NET Core. Во время предварительной подготовки учитывает метаданные, Blazor определенные на странице, и использует систему проверки подлинности ASP.NET Core, чтобы определить, прошел ли пользователь проверку подлинности. Когда пользователь переходит с одной страницы на другую, используется поставщик проверки подлинности на стороне клиента. Когда пользователь обновляет страницу (полная перезагрузка), поставщик состояния проверки подлинности на стороне клиента не участвует в решении проверки подлинности на сервере. Так как состояние пользователя не сохраняется сервером, состояние проверки подлинности, поддерживаемое клиентом, теряется.

Для этого лучше всего выполнить проверку подлинности в системе проверки подлинности ASP.NET Core. Поставщик состояния проверки подлинности на стороне клиента учитывает только состояние проверки подлинности пользователя. Примеры того, как это сделать с помощью поставщиков состояний проверки подлинности, демонстрируются шаблоном Blazor Web App проекта и описаны ниже.

В файле проекта Program сервера вызов AddAuthenticationStateSerialization, который сериализует AuthenticationState возвращаемый сервером AuthenticationStateProvider сервером компонент с помощью службы состояния сохраняемого компонента (PersistentComponentState):

builder.Services.AddRazorComponents()
    .AddInteractiveWebAssemblyComponents()
    .AddAuthenticationStateSerialization();

API сериализует только серверное имя и утверждения роли для доступа в браузере. Чтобы включить все утверждения, установите SerializeAllClaims значение true в вызове AddAuthenticationStateSerializationна стороне сервера:

builder.Services.AddRazorComponents()
    .AddInteractiveWebAssemblyComponents()
    .AddAuthenticationStateSerialization(
        options => options.SerializeAllClaims = true);

В файле проекта клиента (.Client) вызовAddAuthenticationStateDeserialization, который добавляет AuthenticationStateProvider AuthenticationState место десериализации с сервера с помощью AuthenticationStateData службы сохраняемого состояния компонента (PersistentComponentState).Program В серверном проекте должен быть соответствующий вызов AddAuthenticationStateSerialization .

builder.Services.AddAuthorizationCore();
builder.Services.AddCascadingAuthenticationState();
builder.Services.AddAuthenticationStateDeserialization();
  • PersistingRevalidatingAuthenticationStateProvider (справочный источник): для Blazor Web Appустройств, использующих интерактивную отрисовку на стороне сервера (интерактивный SSR) и отрисовку на стороне клиента (CSR). Это серверная сторона AuthenticationStateProvider , которая обновляет метку безопасности для подключенного пользователя каждые 30 минут интерактивного канала. Она также использует службу состояния сохраняемого компонента для потока состояния проверки подлинности клиенту, который затем фиксируется в течение времени существования CSR.

  • PersistingServerAuthenticationStateProvider (ссылочный источник): для Blazor Web Apps, которые применяют только CSR. Это серверная сторона AuthenticationStateProvider , которая использует службу состояния сохраняемого компонента для потока состояния проверки подлинности клиенту, который затем исправлен в течение времени существования CSR.

  • PersistentAuthenticationStateProvider (ссылочный источник): для Blazor Web Apps, которые принимают CSR. Это клиентская сторона AuthenticationStateProvider , которая определяет состояние проверки подлинности пользователя путем поиска данных, сохраненных на странице при отрисовке на сервере. Это состояние проверки подлинности исправлено в течение времени существования CSR. Если пользователю нужно войти или выйти, требуется полная перезагрузка страницы. Это предоставляет только имя пользователя и электронную почту в целях отображения. Он не включает маркеры, которые проходят проверку подлинности на сервере при выполнении последующих запросов, которые обрабатываются отдельно с помощью cookie включенного в HttpClient запросы к серверу.

Примечание.

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

Формирование шаблонов Identity

Дополнительные сведения о шаблоне Identity в серверном Blazor приложении см. в разделе "Шаблон Identity " в проектах ASP.NET Core.

Identity Шаблон в серверное Blazor приложение:

Дополнительные утверждения и маркеры от внешних поставщиков

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

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

При развертывании в Службе приложений Azure в Linux с сервером Identity нужно указать издателя явно. Дополнительные сведения см. в статье "Защита Identity серверной части веб-API для spAs".

Внедрение AuthenticationStateProvider служб, ограниченных компонентом

Не пытайтесь разрешить AuthenticationStateProvider в пользовательской области, так как это приводит к созданию нового экземпляра AuthenticationStateProvider , который неправильно инициализирован.

Чтобы получить доступ AuthenticationStateProvider к службе, ограниченной компонентом, введите @inject AuthenticationStateProvider директиву или [Inject] атрибут и передайте его в службу в качестве параметра. Этот подход гарантирует правильность инициализированного экземпляра приложения для каждого экземпляра пользовательского AuthenticationStateProvider приложения.

ExampleService.cs:

public class ExampleService
{
    public async Task<string> ExampleMethod(AuthenticationStateProvider authStateProvider)
    {
        var authState = await authStateProvider.GetAuthenticationStateAsync();
        var user = authState.User;

        if (user.Identity is not null && user.Identity.IsAuthenticated)
        {
            return $"{user.Identity.Name} is authenticated.";
        }
        else
        {
            return "The user is NOT authenticated.";
        }
    }
}

Зарегистрируйте службу как область действия. В серверном Blazor приложении службы с областью действия имеют время существования, равное длительности канала подключения клиента.

В файле Program:

builder.Services.AddScoped<ExampleService>();

В методе Startup.ConfigureServices в файле Startup.cs:

services.AddScoped<ExampleService>();

Следующий компонент InjectAuthStateProvider:

  • Компонент наследует OwningComponentBase.
  • Он AuthenticationStateProvider внедряется и передается ExampleService.ExampleMethodв .
  • ExampleService разрешено и OwningComponentBase.ScopedServices GetRequiredServiceвозвращает правильный инициализированный экземпляр ExampleService , который существует в течение всего времени существования канала пользователя.

InjectAuthStateProvider.razor:

@page "/inject-auth-state-provider"
@inherits OwningComponentBase
@inject AuthenticationStateProvider AuthenticationStateProvider

<h1>Inject <code>AuthenticationStateProvider</code> Example</h1>

<p>@message</p>

@code {
    private string? message;
    private ExampleService? ExampleService { get; set; }

    protected override async Task OnInitializedAsync()
    {
        ExampleService = ScopedServices.GetRequiredService<ExampleService>();

        message = await ExampleService.ExampleMethod(AuthenticationStateProvider);
    }
}
@page "/inject-auth-state-provider"
@inject AuthenticationStateProvider AuthenticationStateProvider
@inherits OwningComponentBase

<h1>Inject <code>AuthenticationStateProvider</code> Example</h1>

<p>@message</p>

@code {
    private string? message;
    private ExampleService? ExampleService { get; set; }

    protected override async Task OnInitializedAsync()
    {
        ExampleService = ScopedServices.GetRequiredService<ExampleService>();

        message = await ExampleService.ExampleMethod(AuthenticationStateProvider);
    }
}

Дополнительные сведения см. в руководстве по OwningComponentBase внедрению зависимостей ASP.NET CoreBlazor.

Неавторизованное отображение содержимого при предварительной подготовке с помощью пользовательского AuthenticationStateProvider

Чтобы избежать отображения несанкционированного содержимого, например содержимого в AuthorizeView компоненте, при предварительном создании с помощью пользовательского AuthenticationStateProviderподхода следует использовать один из следующих подходов:

  • Отключить предварительную отрисовку: укажите режим отрисовки с prerender параметром, заданным false для компонента самого высокого уровня в иерархии компонентов приложения, который не является корневым компонентом.

    Примечание.

    Создание интерактивного корневого компонента, например App компонента, не поддерживается. Поэтому предварительная подготовка не может быть отключена непосредственно компонентом App .

    Для приложений, основанных на шаблоне Blazor Web App проекта, предварительная отрисовка обычно отключена, где Routes компонент используется в App компоненте (Components/App.razor) :

    <Routes @rendermode="new InteractiveServerRenderMode(prerender: false)" />
    

    Кроме того, отключите предварительную HeadOutlet отрисовку для компонента:

    <HeadOutlet @rendermode="new InteractiveServerRenderMode(prerender: false)" />
    

    Вы также можете выборочно управлять режимом отрисовки, примененным к экземпляру Routes компонента. Например, см. режимы отрисовки ASP.NET CoreBlazor.

  • Отключить предварительную отрисовку: откройте _Host.cshtml файл и измените render-mode атрибут вспомогательного элемента Serverтега компонента на:

    <component type="typeof(App)" render-mode="Server" />
    
  • Проверка подлинности пользователя на сервере перед началом работы приложения. Чтобы применить этот подход, приложение должно отвечать на первоначальный запрос пользователя с Identityпомощью страницы входа на основе или просмотра и запретить любые запросы к Blazor конечным точкам до тех пор, пока они не будут проверены. Дополнительные сведения см. в разделе "Создание приложения ASP.NET Core с пользовательскими данными, защищенными авторизацией". После проверки подлинности несанкционированное содержимое в предварительно созданных Razor компонентах отображается только в том случае, если пользователь действительно не авторизован для просмотра содержимого.

Управление пользовательским состоянием

Несмотря на слово "состояние" в имени, AuthenticationStateProvider не для хранения общего пользовательского состояния. AuthenticationStateProvider Указывает только состояние проверки подлинности пользователя в приложении, независимо от того, вошли ли они в приложение и вошли в систему как.

Проверка подлинности использует ту же ASP.NET проверки подлинности Core Identity , что Razor и приложения Pages и MVC. Состояние пользователя, хранящееся для потоков ASP.NET Core Identity , без Blazor добавления дополнительного кода в приложение. Следуйте инструкциям в статьях и руководствах по ASP.NET Core Identity , чтобы Identity функции вступают в силу в Blazor частях приложения.

Рекомендации по управлению общим состоянием за пределами ASP.NET Core Identityсм. в разделе ASP.NET Управление состоянием CoreBlazor.

Дополнительные абстракции безопасности

Два дополнительных абстракции участвуют в управлении состоянием проверки подлинности:

Примечание.

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

Управление состоянием проверки подлинности при выходе

Blazor Сервер сохраняет состояние проверки подлинности пользователей на протяжении всего времени существования канала, в том числе на вкладках браузера. Чтобы заранее выключить пользователя на вкладках браузера при выходе пользователя на одну вкладку, необходимо реализовать RevalidatingServerAuthenticationStateProvider (эталонный источник) коротким RevalidationInterval.

Примечание.

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

Срок действия URL-адреса временного перенаправления

Этот раздел относится к Blazor Web Apps.

RazorComponentsServiceOptions.TemporaryRedirectionUrlValidityDuration Используйте параметр, чтобы получить или задать время существования ASP.NET срок действия Core Data Protection для URL-адресов временных перенаправлений, создаваемых Blazor отрисовкой на стороне сервера. Они используются только временно, поэтому время существования должно быть достаточно длинным для клиента, чтобы получить URL-адрес и начать навигацию к нему. Однако оно также должно быть достаточно длинным, чтобы разрешить отклонение часов между серверами. Значение по умолчанию — пять минут.

В следующем примере значение распространяется на семь минут:

builder.Services.AddRazorComponents(options => 
    options.TemporaryRedirectionUrlValidityDuration = 
        TimeSpan.FromMinutes(7));

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