состояние проверки подлинности ASP.NET Core Blazor
Примечание.
Это не последняя версия этой статьи. В текущем выпуске см . версию .NET 9 этой статьи.
Предупреждение
Эта версия ASP.NET Core больше не поддерживается. Дополнительные сведения см. в политике поддержки .NET и .NET Core. В текущем выпуске см . версию .NET 9 этой статьи.
Внимание
Эта информация относится к предварительному выпуску продукта, который может быть существенно изменен до его коммерческого выпуска. Майкрософт не предоставляет никаких гарантий, явных или подразумеваемых, относительно приведенных здесь сведений.
В текущем выпуске см . версию .NET 9 этой статьи.
В этой статье объясняется, как создать пользовательского поставщика состояний проверки подлинности и получать уведомления об изменении состояния проверки подлинности пользователей в коде.
Общие подходы, принятые для серверных и клиентских Blazor приложений, похожи, но отличаются в их точных реализациях, поэтому в этой статье рассматриваются серверные Blazor приложения и клиентские Blazor приложения. Используйте селектор сводной таблицы в верхней части статьи, чтобы изменить сводную таблицу статьи в соответствии с типом Blazor проекта, с которым вы работаете:
- Серверные приложения (Serverсводная таблица): Blazor Server для .NET 7 или более ранней Blazor Web App версии, а также серверный Blazor проект для .NET 8 или более поздней версии.
- Клиентские Blazor приложения (Blazor WebAssembly сводная таблица): Blazor WebAssembly для всех версий .NET или
.Client
проекта Blazor Web App для .NET 8 или более поздней версии.
Абстрактный AuthenticationStateProvider
класс
Платформа Blazor включает абстрактный AuthenticationStateProvider класс для предоставления сведений о состоянии проверки подлинности текущего пользователя со следующими членами:
- GetAuthenticationStateAsync: асинхронно получает состояние проверки подлинности текущего пользователя.
- AuthenticationStateChanged: событие, которое предоставляет уведомление при изменении состояния проверки подлинности. Например, это событие может возникать, если пользователь входит или выходит из приложения.
- NotifyAuthenticationStateChanged: вызывает событие изменения состояния проверки подлинности.
Реализация пользовательского AuthenticationStateProvider
Приложение должно ссылаться на Microsoft.AspNetCore.Components.Authorization
пакет NuGet, предоставляющий поддержку проверки подлинности и авторизации для Blazor приложений.
Примечание.
Рекомендации по добавлению пакетов в приложения .NET см. в разделе Способы установки пакетов NuGet в статье Рабочий процесс использования пакета (документация по NuGet). Проверьте правильность версий пакета на сайте NuGet.org.
Настройте в файле следующие службы Program
проверки подлинности, авторизации и каскадной проверки подлинности.
При создании Blazor приложения из одного из Blazor шаблонов проектов с включенной проверкой подлинности приложение предварительно настроено со следующими регистрациями служб, включая предоставление состояния проверки подлинности в качестве каскадного параметра. Дополнительные сведения см. в разделе ASP.NET Проверка подлинности и авторизация Core Blazor с дополнительными сведениями, представленными в статье "Настройка несанкционированного содержимого Router
с помощью раздела компонента".
using Microsoft.AspNetCore.Components.Authorization;
...
builder.Services.AddAuthorization();
builder.Services.AddCascadingAuthenticationState();
Настройте службы проверки подлинности и авторизации в Program
файле.
При создании Blazor приложения из одного из Blazor шаблонов проектов с включенной проверкой подлинности приложение включает следующую регистрацию службы.
using Microsoft.AspNetCore.Components.Authorization;
...
builder.Services.AddAuthorization();
Настройка служб проверки подлинности и авторизации в Startup.ConfigureServices
Startup.cs
.
При создании Blazor приложения из одного из Blazor шаблонов проектов с включенной проверкой подлинности приложение включает следующую регистрацию службы.
using Microsoft.AspNetCore.Components.Authorization;
...
services.AddAuthorization();
В Blazor WebAssembly приложениях (все версии .NET) или .Client
проекте Blazor Web App (.NET 8 или более поздней версии), настройте проверку подлинности, авторизацию и каскадную проверку подлинности в Program
файле.
При создании Blazor приложения из одного из Blazor шаблонов проектов с включенной проверкой подлинности приложение предварительно настроено со следующими регистрациями служб, включая предоставление состояния проверки подлинности в качестве каскадного параметра. Дополнительные сведения см. в разделе ASP.NET Проверка подлинности и авторизация Core Blazor с дополнительными сведениями, представленными в статье "Настройка несанкционированного содержимого Router
с помощью раздела компонента".
using Microsoft.AspNetCore.Components.Authorization;
...
builder.Services.AddAuthorizationCore();
builder.Services.AddCascadingAuthenticationState();
Настройте службы проверки подлинности и авторизации в Program
файле.
При создании Blazor приложения из одного из Blazor шаблонов проектов с включенной проверкой подлинности приложение включает следующую регистрацию службы.
using Microsoft.AspNetCore.Components.Authorization;
...
builder.Services.AddAuthorizationCore();
Подкласс AuthenticationStateProvider и переопределение GetAuthenticationStateAsync для создания состояния проверки подлинности пользователя. В следующем примере все пользователи проходят проверку подлинности с помощью имени пользователя mrfibuli
.
CustomAuthStateProvider.cs
:
using System.Security.Claims;
using Microsoft.AspNetCore.Components.Authorization;
public class CustomAuthStateProvider : AuthenticationStateProvider
{
public override Task<AuthenticationState> GetAuthenticationStateAsync()
{
var identity = new ClaimsIdentity(
[
new Claim(ClaimTypes.Name, "mrfibuli"),
], "Custom Authentication");
var user = new ClaimsPrincipal(identity);
return Task.FromResult(new AuthenticationState(user));
}
}
Примечание.
Предыдущий код, создающий новую ClaimsIdentity упрощенную инициализацию коллекции, представленную в C# 12 (.NET 8). Дополнительные сведения см. в разделе "Выражения коллекции" — справочник по языку C#.
Служба CustomAuthStateProvider
зарегистрирована Program
в файле. Регистрация службы с областью действия:AddScoped
builder.Services.AddScoped<AuthenticationStateProvider, CustomAuthStateProvider>();
Blazor Server В приложении зарегистрируйте службу с AddScopedобластью действия после вызова:AddServerSideBlazor
builder.Services.AddServerSideBlazor();
builder.Services.AddScoped<AuthenticationStateProvider, CustomAuthStateProvider>();
Blazor Server В приложении зарегистрируйте службу с AddScopedобластью действия после вызова:AddServerSideBlazor
services.AddServerSideBlazor();
services.AddScoped<AuthenticationStateProvider, CustomAuthStateProvider>();
Служба CustomAuthStateProvider
зарегистрирована Program
в файле. Зарегистрируйте одноэлементную службу с помощьюAddSingleton:
builder.Services.AddSingleton<AuthenticationStateProvider, CustomAuthStateProvider>();
Если он отсутствует, добавьте @using
инструкцию в _Imports.razor
файл, чтобы сделать Microsoft.AspNetCore.Components.Authorization пространство имен доступным для компонентов:
@using Microsoft.AspNetCore.Components.Authorization;
Подтвердите или измените компонент представления маршрута на компонент AuthorizeRouteView в определении Router компонента. Расположение Router
компонента отличается в зависимости от типа приложения. Используйте поиск, чтобы найти компонент, если вы не знаете о его расположении в проекте.
<Router ...>
<Found ...>
<AuthorizeRouteView RouteData="routeData"
DefaultLayout="typeof(Layout.MainLayout)" />
...
</Found>
</Router>
Примечание.
При создании Blazor приложения из одного из Blazor шаблонов проектов с включенной проверкой подлинности приложение включает компонент AuthorizeRouteView . Дополнительные сведения см. в разделе ASP.NET Проверка подлинности и авторизация Core Blazor с дополнительными сведениями, представленными в статье "Настройка несанкционированного содержимого Router
с помощью раздела компонента".
Router Где находится компонент:
- Подтвердите или измените компонент представления маршрута на .AuthorizeRouteView
- Подтвердите CascadingAuthenticationState или добавьте компонент вокруг Router компонента.
Расположение Router
компонента отличается в зависимости от типа приложения. Используйте поиск, чтобы найти компонент, если вы не знаете о его расположении в проекте.
<CascadingAuthenticationState>
<Router ...>
<Found ...>
<AuthorizeRouteView RouteData="routeData"
DefaultLayout="typeof(MainLayout)" />
...
</Found>
</Router>
</CascadingAuthenticationState>
Примечание.
При создании Blazor приложения из одного из Blazor шаблонов проектов с включенной проверкой подлинности приложение включает AuthorizeRouteView и CascadingAuthenticationState компоненты. Дополнительные сведения см. в разделе ASP.NET Проверка подлинности и авторизация Core Blazor с дополнительными сведениями, представленными в статье "Настройка несанкционированного содержимого Router
с помощью раздела компонента".
В следующем примере AuthorizeView компонента показано имя пользователя, прошедшего проверку подлинности:
<AuthorizeView>
<Authorized>
<p>Hello, @context.User.Identity?.Name!</p>
</Authorized>
<NotAuthorized>
<p>You're not authorized.</p>
</NotAuthorized>
</AuthorizeView>
Инструкции AuthorizeViewпо использованию см. в разделе ASP.NET Проверка подлинности и авторизация CoreBlazor.
Уведомления об изменении состояния проверки подлинности
Пользователь AuthenticationStateProvider
может вызываться NotifyAuthenticationStateChanged в базовом AuthenticationStateProvider классе, чтобы уведомить потребителей о изменении состояния проверки подлинности на rerender.
Следующий пример основан на реализации пользовательского, AuthenticationStateProvider следуя указаниям в разделе "Реализация пользовательского AuthenticationStateProvider
" выше в этой статье. Если вы уже выполнили инструкции, приведенные в этом разделе, то в этом CustomAuthStateProvider
разделе будет заменено следующее.
Следующая CustomAuthStateProvider
реализация предоставляет пользовательский метод, AuthenticateUser
чтобы войти в систему пользователя и уведомить потребителей об изменении состояния проверки подлинности.
CustomAuthStateProvider.cs
:
using System.Security.Claims;
using Microsoft.AspNetCore.Components.Authorization;
public class CustomAuthStateProvider : AuthenticationStateProvider
{
public override Task<AuthenticationState> GetAuthenticationStateAsync()
{
var identity = new ClaimsIdentity();
var user = new ClaimsPrincipal(identity);
return Task.FromResult(new AuthenticationState(user));
}
public void AuthenticateUser(string userIdentifier)
{
var identity = new ClaimsIdentity(
[
new Claim(ClaimTypes.Name, userIdentifier),
], "Custom Authentication");
var user = new ClaimsPrincipal(identity);
NotifyAuthenticationStateChanged(
Task.FromResult(new AuthenticationState(user)));
}
}
Примечание.
Предыдущий код, создающий новую ClaimsIdentity упрощенную инициализацию коллекции, представленную в C# 12 (.NET 8). Дополнительные сведения см. в разделе "Выражения коллекции" — справочник по языку C#.
В компоненте :
- Внедрить AuthenticationStateProvider.
- Добавьте поле для хранения идентификатора пользователя.
- Добавьте кнопку и метод для приведения AuthenticationStateProvider
CustomAuthStateProvider
и вызоваAuthenticateUser
с идентификатором пользователя.
@inject AuthenticationStateProvider AuthenticationStateProvider
<input @bind="userIdentifier" />
<button @onclick="SignIn">Sign in</button>
<AuthorizeView>
<Authorized>
<p>Hello, @context.User.Identity?.Name!</p>
</Authorized>
<NotAuthorized>
<p>You're not authorized.</p>
</NotAuthorized>
</AuthorizeView>
@code {
public string userIdentifier = string.Empty;
private void SignIn()
{
((CustomAuthStateProvider)AuthenticationStateProvider)
.AuthenticateUser(userIdentifier);
}
}
Предыдущий подход можно улучшить для активации уведомлений об изменениях состояния проверки подлинности с помощью пользовательской службы. CustomAuthenticationService
Следующий класс поддерживает субъект утверждений текущего пользователя в резервном поле () с событием (currentUser
UserChanged
), на которое может подписаться поставщик состояния проверки подлинности, где вызывается NotifyAuthenticationStateChangedсобытие. С дополнительной конфигурацией далее в этом разделе CustomAuthenticationService
можно внедрить в компонент с логикой, которая задает CurrentUser
триггер UserChanged
события.
CustomAuthenticationService.cs
:
using System.Security.Claims;
public class CustomAuthenticationService
{
public event Action<ClaimsPrincipal>? UserChanged;
private ClaimsPrincipal? currentUser;
public ClaimsPrincipal CurrentUser
{
get { return currentUser ?? new(); }
set
{
currentUser = value;
if (UserChanged is not null)
{
UserChanged(currentUser);
}
}
}
}
Program
В файле зарегистрируйте CustomAuthenticationService
контейнер внедрения зависимостей:
builder.Services.AddScoped<CustomAuthenticationService>();
В Startup.ConfigureServices
этом Startup.cs
случае зарегистрируйте CustomAuthenticationService
контейнер внедрения зависимостей:
services.AddScoped<CustomAuthenticationService>();
Program
В файле зарегистрируйте CustomAuthenticationService
контейнер внедрения зависимостей:
builder.Services.AddSingleton<CustomAuthenticationService>();
CustomAuthStateProvider
Следующие подписки на CustomAuthenticationService.UserChanged
событие. Метод GetAuthenticationStateAsync
возвращает состояние проверки подлинности пользователя. Изначально состояние проверки подлинности основано на значении CustomAuthenticationService.CurrentUser
. При изменении пользователя создается новое состояние проверки подлинности для нового пользователя (new AuthenticationState(newUser)
) для вызовов GetAuthenticationStateAsync
:
using Microsoft.AspNetCore.Components.Authorization;
public class CustomAuthStateProvider : AuthenticationStateProvider
{
private AuthenticationState authenticationState;
public CustomAuthStateProvider(CustomAuthenticationService service)
{
authenticationState = new AuthenticationState(service.CurrentUser);
service.UserChanged += (newUser) =>
{
authenticationState = new AuthenticationState(newUser);
NotifyAuthenticationStateChanged(Task.FromResult(authenticationState));
};
}
public override Task<AuthenticationState> GetAuthenticationStateAsync() =>
Task.FromResult(authenticationState);
}
Метод следующего компонента SignIn
создает субъект утверждений для идентификатора пользователя, который необходимо задать:CustomAuthenticationService.CurrentUser
@using System.Security.Claims
@inject CustomAuthenticationService AuthService
<input @bind="userIdentifier" />
<button @onclick="SignIn">Sign in</button>
<AuthorizeView>
<Authorized>
<p>Hello, @context.User.Identity?.Name!</p>
</Authorized>
<NotAuthorized>
<p>You're not authorized.</p>
</NotAuthorized>
</AuthorizeView>
@code {
public string userIdentifier = string.Empty;
private void SignIn()
{
var currentUser = AuthService.CurrentUser;
var identity = new ClaimsIdentity(
[
new Claim(ClaimTypes.Name, userIdentifier),
],
"Custom Authentication");
var newUser = new ClaimsPrincipal(identity);
AuthService.CurrentUser = newUser;
}
}
Примечание.
Предыдущий код, создающий новую ClaimsIdentity упрощенную инициализацию коллекции, представленную в C# 12 (.NET 8). Дополнительные сведения см. в разделе "Выражения коллекции" — справочник по языку C#.
Дополнительные ресурсы
- Неавторизованное содержимое на стороне сервера при предварительной подготовке пользовательского содержимого
AuthenticationStateProvider
- Как получить доступ к объекту
AuthenticationStateProvider
изDelegatingHandler
настройки с помощьюIHttpClientFactory
- Защита ASP.NET Core Blazor Web App с помощью OpenID Connect (OIDC)
- Защита ASP.NET Core Blazor WebAssembly с помощью ASP.NET Core Identity
- Неавторизованное содержимое на стороне сервера при предварительной подготовке пользовательского содержимого
AuthenticationStateProvider
- Как получить доступ к объекту
AuthenticationStateProvider
изDelegatingHandler
настройки с помощьюIHttpClientFactory
- Защита ASP.NET Core Blazor Web App с помощью OpenID Connect (OIDC)
- Защита ASP.NET Core Blazor WebAssembly с помощью предварительной подготовки ASP.NET Core Identityс проверкой подлинности в размещенных приложениях Blazor WebAssembly
ASP.NET Core