Безопасные приложения на стороне Blazor сервера ASP.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помощью S на каждой навигации по страницам. Проверка подлинности проверка во время событий навигации. Тем не менее, 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.
  • платформа удостоверений Майкрософт. Дополнительные сведения см. в разделе ASP.NET Проверка подлинности и авторизация CoreBlazor.
  • Windows: используйте проверку подлинности Windows.

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

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

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

Шаблон обрабатывает следующее:

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

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

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

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

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

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

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

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

Примечание.

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

Управление состоянием проверки подлинности в Blazor веб-приложения

Этот раздел относится к Blazor веб-приложения, которые применяются:

  • Интерактивная отрисовка на стороне сервера (интерактивная среда SSR) и CSR.
  • Отрисовка на стороне клиента (CSR).

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

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

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

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

  • PersistentAuthenticationStateProvider(справочный источник): для Blazor веб-приложения, которые принимают 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

Если приложению требуется пользовательский поставщик, реализуйте и переопределите AuthenticationStateProviderGetAuthenticationStateAsync.

В следующем примере все пользователи проходят проверку подлинности с помощью имени пользователя mrfibuli.

CustomAuthStateProvider.cs:

using System.Security.Claims;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Components.Authorization;

public class CustomAuthStateProvider : AuthenticationStateProvider
{
    public override Task<AuthenticationState> GetAuthenticationStateAsync()
    {
        var identity = new ClaimsIdentity(new[]
        {
            new Claim(ClaimTypes.Name, "mrfibuli"),
        }, "Custom Authentication");

        var user = new ClaimsPrincipal(identity);

        return Task.FromResult(new AuthenticationState(user));
    }
}

Служба CustomAuthStateProvider зарегистрирована Program в файле:

using Microsoft.AspNetCore.Components.Authorization;

...

builder.Services.AddScoped<AuthenticationStateProvider, CustomAuthStateProvider>();

Служба CustomAuthStateProvider регистрируется в Program файле после вызова AddServerSideBlazor:

using Microsoft.AspNetCore.Components.Authorization;

...

builder.Services.AddServerSideBlazor();

...

builder.Services.AddScoped<AuthenticationStateProvider, CustomAuthStateProvider>();

Служба CustomAuthStateProvider зарегистрирована послеStartup.ConfigureServicesStartup.cs вызова:AddServerSideBlazor

using Microsoft.AspNetCore.Components.Authorization;

...

services.AddServerSideBlazor();

...

services.AddScoped<AuthenticationStateProvider, CustomAuthStateProvider>();

Подтвердите или добавьте компонент AuthorizeRouteViewRouter .

В компоненте Routes (Components/Routes.razor):

<Router ...>
    <Found ...>
        <AuthorizeRouteView RouteData="routeData" 
            DefaultLayout="typeof(Layout.MainLayout)" />
        ...
    </Found>
</Router>

Добавьте каскадные службы проверки подлинности в коллекцию служб в Program файле:

builder.Services.AddCascadingAuthenticationState();

Примечание.

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

Подтвердите или добавьте и AuthorizeRouteViewCascadingAuthenticationState в Router компонент:

<CascadingAuthenticationState>
    <Router ...>
        <Found ...>
            <AuthorizeRouteView RouteData="routeData" 
                DefaultLayout="typeof(MainLayout)" />
            ...
        </Found>
    </Router>
</CascadingAuthenticationState>

Примечание.

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

Демонстрирует 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 реализация предоставляет пользовательский метод, AuthenticateUserчтобы войти в систему пользователя и уведомить потребителей об изменении состояния проверки подлинности.

CustomAuthStateProvider.cs:

using System.Security.Claims;
using System.Threading.Tasks;
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[]
        {
            new Claim(ClaimTypes.Name, userIdentifier),
        }, "Custom Authentication");

        var user = new ClaimsPrincipal(identity);

        NotifyAuthenticationStateChanged(
            Task.FromResult(new AuthenticationState(user)));
    }
}

В компоненте :

  • Внедрить AuthenticationStateProvider.
  • Добавьте поле для хранения идентификатора пользователя.
  • Добавьте кнопку и метод для приведения AuthenticationStateProviderCustomAuthStateProvider и вызова 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);
    }
}
@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);
    }
}

Предыдущий подход можно улучшить для активации уведомлений об изменениях состояния проверки подлинности с помощью пользовательской службы. В следующем AuthenticationService случае субъект утверждений текущего пользователя хранится в поле резервного копирования () с событием (currentUserUserChanged), на которое AuthenticationStateProvider можно подписаться, где вызывается NotifyAuthenticationStateChangedсобытие. С дополнительной конфигурацией далее в этом разделе AuthenticationService можно внедрить в компонент с логикой, которая задает CurrentUser триггер UserChanged события.

using System.Security.Claims;

public class AuthenticationService
{
    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 В файле зарегистрируйте AuthenticationService контейнер внедрения зависимостей:

builder.Services.AddScoped<AuthenticationService>();

В Startup.ConfigureServices этом Startup.csслучае зарегистрируйте AuthenticationService контейнер внедрения зависимостей:

services.AddScoped<AuthenticationService>();

CustomAuthStateProvider Следующие подписки на AuthenticationService.UserChanged событие. GetAuthenticationStateAsync возвращает состояние проверки подлинности пользователя. Изначально состояние проверки подлинности основано на значении AuthenticationService.CurrentUser. При изменении пользователя создается новое состояние проверки подлинности с новым пользователем (new AuthenticationState(newUser)) для вызовов GetAuthenticationStateAsync:

using System.Security.Claims;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Components.Authorization;

public class CustomAuthStateProvider : AuthenticationStateProvider
{
    private AuthenticationState authenticationState;

    public CustomAuthStateProvider(AuthenticationService service)
    {
        authenticationState = new AuthenticationState(service.CurrentUser);

        service.UserChanged += (newUser) =>
        {
            authenticationState = new AuthenticationState(newUser);

            NotifyAuthenticationStateChanged(
                Task.FromResult(new AuthenticationState(newUser)));
        };
    }

    public override Task<AuthenticationState> GetAuthenticationStateAsync() =>
        Task.FromResult(authenticationState);
}

Метод следующего компонента SignIn создает субъект утверждений для идентификатора пользователя, который необходимо задать:AuthenticationService.CurrentUser

@inject AuthenticationService AuthenticationService

<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 = AuthenticationService.CurrentUser;

        var identity = new ClaimsIdentity(
            new[]
            {
                new Claim(ClaimTypes.Name, userIdentifier),
            },
            "Custom Authentication");

        var newUser = new ClaimsPrincipal(identity);

        AuthenticationService.CurrentUser = newUser;
    }
}
@inject AuthenticationService AuthenticationService

<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 = AuthenticationService.CurrentUser;

        var identity = new ClaimsIdentity(
            new[]
            {
                new Claim(ClaimTypes.Name, userIdentifier),
            },
            "Custom Authentication");

        var newUser = new ClaimsPrincipal(identity);

        AuthenticationService.CurrentUser = newUser;
    }
}

Внедрение AuthenticationStateProvider служб, область в компонент

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

Чтобы получить доступ AuthenticationStateProvider к службе, область к компоненту, введите @injectAuthenticationStateProvider директиву или [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.";
        }
    }
}

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

В файле Program:

builder.Services.AddScoped<ExampleService>();

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

services.AddScoped<ExampleService>();

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

  • Компонент наследует OwningComponentBase.
  • Он AuthenticationStateProvider внедряется и передается ExampleService.ExampleMethodв .
  • ExampleService разрешено и OwningComponentBase.ScopedServicesGetRequiredServiceвозвращает правильный инициализированный экземпляр 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 проекта веб-приложения, предварительная отрисовка обычно отключена, где 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).

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

Этот раздел относится к Blazor веб-приложения.

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

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

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

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