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


Защита ASP.NET Core Blazor Web App с помощью проверки подлинности Windows

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

Спецификация приложения для Blazor Web App:

Пример приложения

Доступ к образцу можно получить через папку с последней версией в репозитории образцов Blazor, используя следующую ссылку. Пример находится в папке BlazorWebAppWinAuthServer для .NET 9 или более поздней версии.

Просмотреть или скачать образец кода (описание загрузки)

Конфигурация

Пример приложения не требует конфигурации для локального запуска.

При развертывании на хосте, таком как IIS, приложению необходимо использовать режим олицетворения, чтобы выполняться под учетной записью пользователя. Дополнительные сведения см. в статье Настройка проверки подлинности Windows в ASP.NET Core.

Пример кода приложения

Program Проверьте файл в примере приложения для следующих вызовов API.

AddAuthentication вызывается с помощью NegotiateDefaults.AuthenticationScheme схемы проверки подлинности. AddNegotiate настраивает AuthenticationBuilder для использования аутентификации Negotiate (также известной как Windows, Kerberos или NTLM), а обработчик аутентификации поддерживает Kerberos на серверах Windows и Linux.

builder.Services.AddAuthentication(NegotiateDefaults.AuthenticationScheme)
    .AddNegotiate();

AddAuthorization добавляет службы политики авторизации. AuthorizationOptions.FallbackPolicy задает резервную политику авторизации, которая задана для политики по умолчанию (AuthorizationOptions.DefaultPolicy). Политика по умолчанию требует от пользователя, прошедшего проверку подлинности, для доступа к приложению:

builder.Services.AddAuthorization(options =>
{
    options.FallbackPolicy = options.DefaultPolicy;
});

AddCascadingAuthenticationState добавляет каскадное состояние аутентификации в коллекцию сервисов. Это эквивалентно размещению CascadingAuthenticationState компонента в корне иерархии компонентов приложения:

builder.Services.AddCascadingAuthenticationState();

Политика авторизации добавляется для идентификатора безопасности Windows (SID). Известный S-1-5-113 SID в следующем примере указывает, что пользователь является локальной учетной записью. Это ограничивает сетевой вход только на локальные учетные записи, а не на "администратора" или эквивалентные учетные записи.

builder.Services.AddAuthorizationBuilder()
    .AddPolicy("LocalAccount", policy =>
        policy.RequireClaim(
            "http://schemas.microsoft.com/ws/2008/06/identity/claims/groupsid",
            "S-1-5-113"));   

Политика авторизации применяется компонентом LocalAccountOnly .

Components/Pages/LocalAccountOnly.razor:

@page "/local-account-only"
@using Microsoft.AspNetCore.Authorization
@attribute [Authorize("LocalAccount")]

<h1>Local Account Only</h1>

<p>
    You can only reach this page by satisfying the
    <code>LocalAccount</code> authorization policy.
</p>

Компонент UserClaims перечисляет утверждения пользователя, включая идентификаторы безопасности Windows (SID).

Components/Pages/UserClaims.razor:

@page "/user-claims"
@using System.Security.Claims
@using Microsoft.AspNetCore.Authorization
@attribute [Authorize]

<PageTitle>User Claims</PageTitle>

<h1>User Claims</h1>

@if (claims.Any())
{
    <ul>
        @foreach (var claim in claims)
        {
            <li><b>@claim.Type:</b> @claim.Value</li>
        }
    </ul>
}

@code {
    private IEnumerable<Claim> claims = [];

    [CascadingParameter]
    private Task<AuthenticationState>? AuthState { get; set; }

    protected override async Task OnInitializedAsync()
    {
        if (AuthState == null)
        {
            return;
        }

        var authState = await AuthState;
        claims = authState.User.Claims;
    }
}

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