Безопасные приложения на стороне 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 канале, которое можно обновить в любое время на сервере с помощью повторной AuthenticationStateProvider
проверки подлинности ](#additional-authentication-state-providers).
Внимание
Реализация пользовательского элемента NavigationManager
для проверки подлинности во время навигации не рекомендуется. Если приложение должно выполнить пользовательскую логику состояния проверки подлинности во время навигации, используйте пользовательскую AuthenticationStateProvider
.
Примечание.
Примеры кода в этой статье используют типы ссылок, допускающие значение NULL (NRTs) и статический анализ состояния .NET компилятора NULL, которые поддерживаются в ASP.NET Core в .NET 6 или более поздней версии. При назначении ASP.NET Core 5.0 или более ранней версии удалите обозначение типа NULL (?
) из примеров, приведенных в этой статье.
Безопасность конфиденциальных данных и учетных данных на стороне сервера
В средах тестирования и промежуточной и рабочей среды код на стороне Blazor сервера и веб-API должны использовать безопасные потоки проверки подлинности, которые не поддерживают учетные данные в файлах кода проекта или конфигурации. Вне локального тестирования разработки рекомендуется избегать использования переменных среды для хранения конфиденциальных данных, так как переменные среды не являются наиболее безопасным подходом. Для локального тестирования разработки средство Secret Manager рекомендуется для защиты конфиденциальных данных. Дополнительные сведения см. на следующих ресурсах:
- Потоки безопасной проверки подлинности (документация по ASP.NET Core)
- Управляемые удостоверения для служб Microsoft Azure (Blazor документация)
Для локальной разработки и тестирования на стороне клиента и сервера используйте средство Диспетчера секретов для защиты конфиденциальных учетных данных.
шаблон проекта;
Создайте серверное 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
подхода следует использовать один из следующих подходов:
Реализуйте IHostEnvironmentAuthenticationStateProvider для настраиваемого AuthenticationStateProvider элемента для поддержки предварительной подготовки: пример реализации платформы смBlazor. в разделе о реализации IHostEnvironmentAuthenticationStateProviderплатформы
ServerAuthenticationStateProvider.cs
ServerAuthenticationStateProvider (эталонный источник).>. Примечание.
По ссылкам в документации на справочные материалы по .NET обычно загружается ветвь репозитория по умолчанию, которая представляет текущую разработку для следующего выпуска .NET. Чтобы выбрать тег для определенного выпуска, используйте раскрывающийся список Switch branches or tags (Переключение ветвей или тегов). Дополнительные сведения см. в статье Выбор тега версии исходного кода ASP.NET Core (dotnet/AspNetCore.Docs #26205).
Отключить предварительную отрисовку: укажите режим отрисовки с
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.
Дополнительные поставщики состояний проверки подлинности
Два дополнительных класса, производных от AuthenticationStateProvider справки по управлению состоянием проверки подлинности на сервере:
ServerAuthenticationStateProvider (ссылочный источник): по умолчанию AuthenticationStateProvider , используемого Blazor платформой для управления состоянием проверки подлинности на сервере, если более конкретный поставщик не зарегистрирован.
RevalidatingServerAuthenticationStateProvider (ссылочный источник): базовый класс для AuthenticationStateProvider служб, получающих состояние проверки подлинности из среды узла и перенастраив его через регулярные интервалы. Пример реализации см. в шаблоне Blazor Web App проекта. Переопределите RevalidationInterval , чтобы изменить интервал повторной обработки по умолчанию 30 минут.
Примечание.
По ссылкам в документации на справочные материалы по .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));
Дополнительные ресурсы
- Краткое руководство. Добавление входа с помощью Корпорации Майкрософт в веб-приложение ASP.NET Core
- Краткое руководство. Защита веб-API ASP.NET Core с помощью платформы Майкрософт identity
- Настройка ASP.NET Core для работы с прокси-серверами и подсистемами балансировки нагрузки. Содержит рекомендации по следующим вопросам:
- Использование ПО промежуточного слоя перенаправленных заголовков для сохранения сведений о схеме HTTPS на прокси-серверах и во внутренних сетях.
- Дополнительные сценарии и варианты использования, включая ручную настройку схемы, изменение пути запроса для правильной маршрутизации запроса и перенаправление схемы запроса для обратных прокси-серверов Linux и обратных прокси-серверов, отличных от IIS.
ASP.NET Core