Поделиться через


состояние проверки подлинности ASP.NET Core Blazor

Примечание.

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

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

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

Внимание

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

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

В этой статье объясняется, как создать пользовательского поставщика состояний проверки подлинности и получать уведомления об изменении состояния проверки подлинности пользователей в коде.

Общие подходы, принятые для серверных и клиентских 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 Следующий класс поддерживает субъект утверждений текущего пользователя в резервном поле () с событием (currentUserUserChanged), на которое может подписаться поставщик состояния проверки подлинности, где вызывается 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#.

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