К основному содержанию
скилл CX Codex

configure-auth — скилл для Claude Code: что делает и как установить

Настраивает аутентификацию и авторизацию в Blazor Web App с учётом режимов рендеринга. Помогает подружить интерактивные компоненты с ASP.NET Core Identity.

Установить в Claude Code · Через Skills CLI (Vercel) Все способы и платформы ↓
npx skills add dotnet/skills --skill configure-auth -a claude-code
Открыть на GitHub

Что делает configure-auth

Скилл даёт ИИ-агенту инструкцию по настройке безопасности в проектах Blazor Web App. Сначала агент проверяет AGENTS.md в корне рабочей области, чтобы выяснить режим интерактивности. Затем регистрирует службы авторизации и ASP.NET Core Identity в Program.cs, настраивает AuthorizeRouteView в маршрутизаторе и защищает страницы через атрибут [Authorize].

Главная сложность в Blazor — правильная изоляция страниц учётных записей. SignInManager и UserManager обращаются к HttpContext напрямую и вызывают исключение внутри интерактивных компонентов. Поэтому скилл переводит страницы входа на статический SSR с помощью атрибута [ExcludeFromInteractiveRouting].

Для WebAssembly и Auto-режима скилл добавляет вызовы AddAuthenticationStateSerialization на сервере и десериализацию на клиенте. Без этого браузер потеряет состояние пользователя после передачи управления на клиент.

Какие задачи решает

  • настроить ASP.NET Core Identity и политики доступа в Blazor Web App
  • предотвратить сбои SignInManager в интерактивных компонентах
  • передать состояние аутентификации между сервером и WebAssembly
  • закрыть маршруты атрибутом [Authorize] и фильтровать интерфейс через AuthorizeView

Примеры запросов агенту

  • Настрой авторизацию через ASP.NET Core Identity для нашего Blazor Web App с глобальным интерактивным режимом
  • Исправь ошибку с SignInManager при входе пользователя на странице Account/Login
  • Почему состояние авторизации сбрасывается в анонимное после загрузки WebAssembly?

Как установить configure-auth

1Через Skills CLI (Vercel)

npx skills add dotnet/skills --skill configure-auth -a claude-code

2Вручную: положить файлы

~/.claude/skills/configure-auth/SKILL.md

Папка скилла целиком; для одного проекта — .claude/skills/configure-auth/

По шагам, с командами для каждой платформы: Как установить скилл в Claude Code: пять способов

Вопросы о configure-auth

Как установить configure-auth в Claude Code?

Выполните команду npx skills add dotnet/skills --skill configure-auth -a claude-code в терминале.

Что делает скилл configure-auth?

Он инструктирует агент, как корректно внедрить аутентификацию и авторизацию в проект Blazor Web App. Скилл учитывает режимы рендеринга и защищает страницы через [Authorize] или AuthorizeView.

Почему страницы входа должны оставаться в статическом SSR?

Компоненты SignInManager и UserManager используют HttpContext, поэтому при вызове в интерактивном режиме они выбрасывают InvalidOperationException. Для них требуется статический SSR или атрибут [ExcludeFromInteractiveRouting].

Исходный текст

SKILL.md · MIT
---
license: MIT
name: configure-auth
description: >
  Add authentication and authorization to a Blazor Web App, accounting for the app's render mode.
  USE WHEN the user needs [Authorize] on pages, AuthorizeView, role or policy-based access,
  login/logout Identity pages, or AuthenticationStateProvider.
  Also USE WHEN auth state is null after WebAssembly loads, SignInManager throws in an interactive
  component, NotAuthorized content never renders in static SSR, or HttpContext.User is null in
  an interactive component.
  DO NOT USE for general component authoring (see author-component), for prerendering concerns
  unrelated to auth (see support-prerendering), or for managing non-auth cascading state
  (see coordinate-components).
---

# Configure Auth

## Step 1 — Read AGENTS.md

Read `AGENTS.md` at the workspace root for the project's interactivity mode and scope before making changes.

## Step 2 — Register auth services in Program.cs

```csharp
// Program.cs (server project)
builder.Services.AddCascadingAuthenticationState();
builder.Services.AddAuthorization();
```

For ASP.NET Core Identity add the Identity services:

```csharp
builder.Services.AddAuthentication(options =>
{
    options.DefaultScheme = IdentityConstants.ApplicationScheme;
    options.DefaultSignInScheme = IdentityConstants.ExternalScheme;
})
.AddIdentityCookies();

builder.Services.AddIdentityCore<ApplicationUser>()
    .AddRoles<IdentityRole>()
    .AddEntityFrameworkStores<ApplicationDbContext>()
    .AddSignInManager()
    .AddDefaultTokenProviders();
```

## Step 3 — Wire App.razor for auth and render mode

The `App.razor` component must use `AuthorizeRouteView` and conditionally apply the render mode so that pages excluded from interactive routing render statically.

```razor
<!DOCTYPE html>
<html>
<head>
    <HeadOutlet @rendermode="RenderModeForPage" />
</head>
<body>
    <Routes @rendermode="RenderModeForPage" />
    <script src="_framework/blazor.web.js"></script>
</body>
</html>

@code {
    [CascadingParameter]
    public HttpContext HttpContext { get; set; } = default!;

    private IComponentRenderMode? RenderModeForPage =>
        HttpContext.AcceptsInteractiveRouting()
            ? InteractiveServer   // replace with the app's render mode
            : null;
}
```

In `Routes.razor` (or wherever the router lives), use `AuthorizeRouteView`:

```razor
<Router AppAssembly="typeof(Program).Assembly">
    <Found Context="routeData">
        <AuthorizeRouteView RouteData="routeData"
                            DefaultLayout="typeof(Layout.MainLayout)">
            <NotAuthorized>
                @if (context.User.Identity?.IsAuthenticated != true)
                {
                    <RedirectToLogin />
                }
                else
                {
                    <p>You are not authorized to access this resource.</p>
                }
            </NotAuthorized>
        </AuthorizeRouteView>
        <FocusOnNavigate RouteData="routeData" Selector="h1" />
    </Found>
</Router>
```

## Step 4 — Protect pages and components

### [Authorize] attribute on pages

```razor
@page "/admin"
@attribute [Authorize]
```

With roles or policies:

```razor
@attribute [Authorize(Roles = "Admin")]
@attribute [Authorize(Policy = "RequireManager")]
```

### AuthorizeView for conditional UI

```razor
<AuthorizeView>
    <Authorized>Welcome, @context.User.Identity?.Name!</Authorized>
    <NotAuthorized><a href="Account/Login">Log in</a></NotAuthorized>
</AuthorizeView>
```

Role/policy variants:

```razor
<AuthorizeView Roles="Admin,Manager">
    <Authorized>Admin content here</Authorized>
</AuthorizeView>
```

### Access auth state in code

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

protected override async Task OnInitializedAsync()
{
    if (AuthState is not null)
    {
        var state = await AuthState;
        var isAdmin = state.User.IsInRole("Admin");
    }
}
```

## Step 5 — Identity pages must stay static SSR

`SignInManager` and `UserManager` use `HttpContext` internally and **throw in interactive components**. Identity pages (login, register, manage) must render as static SSR.

In a **globally interactive** app, mark every Identity page:

```razor
@page "/Account/Login"
@attribute [ExcludeFromInteractiveRouting]
```

This forces a full-page navigation (exits the interactive circuit) so the page renders through the static SSR pipeline with a real `HttpContext`.

`App.razor` must use `AcceptsInteractiveRouting()` (Step 3) to return `null` for these pages — otherwise the framework still tries to render them interactively.

In a **per-page** app, Identity pages are static by default (no `@rendermode` directive), so `[ExcludeFromInteractiveRouting]` is not needed.

## Step 6 — Auth state in WebAssembly / Auto mode

WebAssembly components run in the browser and have no `HttpContext`. Auth state must be serialized from the server during prerendering and deserialized on the client.

**Server `Program.cs`:**

```csharp
builder.Services.AddAuthenticationStateSerialization();
```

**Client `.Client/Program.cs`:**

```csharp
builder.Services.AddAuthenticationStateDeserialization();
```

Without these calls, `Task<AuthenticationState>` resolves to an anonymous user after WebAssembly takes over from prerendering.

`AddAuthenticationStateSerialization` accepts options to include role and claim data:

```csharp
builder.Services.AddAuthenticationStateSerialization(options =>
    options.SerializeAllClaims = true);
```

## Render Mode × Auth Matrix

| Render mode | HttpContext.User | SignInManager | Auth state source | Key requirement |
|---|---|---|---|---|
| Static SSR | Available | Works | Server pipeline | Use middleware for redirects, `<NotAuthorized>` does NOT render |
| Server (interactive) | NOT available | Throws | `CascadingAuthenticationState` | Use `[Authorize]` + `AuthorizeView`, not `HttpContext` |
| WebAssembly | NOT available | Throws | Serialized from server | `AddAuthenticationStateSerialization` / `Deserialization` |
| Auto | NOT available after WASM | Throws | Serialized from server | Same as WebAssembly; register in **both** Program.cs files |

## Common Mistakes

| Mistake | Symptom | Fix |
|---------|---------|-----|
| Using `HttpContext.User` in interactive component | Null or stale claims | Use `[CascadingParameter] Task<AuthenticationState>` |
| `SignInManager` in interactive component | `InvalidOperationException` | Move to static SSR page with `[ExcludeFromInteractiveRouting]` |
| Missing `AddAuthenticationStateSerialization` | Anonymous user after WASM loads | Add to server Program.cs; add `Deserialization` to client Program.cs |
| `<NotAuthorized>` in static SSR layout | Content never shown | Static SSR uses middleware pipeline; redirect via `LoginPath` or `RedirectToLogin` component |
| Global interactivity without `AcceptsInteractiveRouting` | Identity pages crash | Add `AcceptsInteractiveRouting()` check in App.razor (Step 3) |
| Missing `AddCascadingAuthenticationState()` | `Task<AuthenticationState>` is null | Register in Program.cs (Step 2) |

© dotnet · MIT · dotnet/skills

Похожие скиллы

Всё по теме «Безопасность» →
fluentui-blazor официальный Adrien Clerbois Скилл с правильными шаблонами Fluent UI Blazor плюс MCP-сервер для поиска компонентов, иконок и документации по актуальной версии. ★ 40 418звёзд репо dotnet-patterns affaan-m Набор архитектурных правил C# и ASP.NET Core для ИИ-ассистентов. Задаёт стандарты написания чистого кода, работы с DI, асинхронностью и обработкой ошибок. CX Codex +1 4 600установок api-versioning codewithmukesh Направляет агента при версионировании ASP.NET Core API через библиотеку Asp.Versioning. Помогает настроить пути, заголовки и мягкую депрекацию устаревших версий. CX Codex +1 2 800установок csharp-developer https://github.com/Jeffallan Настраивает правила разработки на .NET 8 и C# 12 для создания API, Blazor-приложений и работы с EF Core. Пригодится при проектировании сервисов с CQRS и Result pattern. CX Codex +1 4 800установок aspnet-core официальный openai Помогает проектировать, писать и обновлять приложения на ASP.NET Core по официальным гайдам Microsoft. Пригодится при работе с Blazor, Minimal API и gRPC. CX Codex +1 3 900установок c-sharp Mindrally Задаёт агенту стиль кода на C#: именование, async, DI, тесты, Blazor и Unity. Пригодится, когда проект на .NET и не хочется каждый раз объяснять конвенции. CX Codex +1 760установок

Из того же набора101

android-tombstone-symbolication Разбирает нативные фреймы из tombstone-файла Android-приложения на .NET: достаёт имена функций, файлы и номера строк. CX Codex +1 3 300установок migrate-static-to-wrapper Меняет статические вызовы в C# на инжектируемые абстракции: DateTime.UtcNow на TimeProvider, File.* на IFileSystem. Работает в границах одного файла, проекта или неймспейса. CX Codex +1 3 300установок template-instantiation Разворачивает проекты .NET через dotnet new, подстраиваясь под Directory.Packages.props и целевые фреймворки в репозитории. Помогает генерировать чистые шаблоны без конфликтов версий. CX Codex +1 3 300установок template-discovery Подбирает шаблоны dotnet new по описанию проекта, проверяет параметры и объясняет результат до создания файлов. CX Codex +1 3 300установок apple-crash-symbolication Превращает адреса из нативного бэктрейса в .ips-логе в имена функций, файлы и строки исходников .NET. Нужен, когда MAUI или Mono-приложение падает на iOS, tvOS, macOS или Mac Catalyst. CX Codex +1 3 100установок system-text-json-net11 Скилл подсказывает агенту, как применять три новых API System.Text.Json из .NET 11, и не даёт писать обходные пути вместо них. CX Codex +1 3 100установок maui-safe-area Помогает настроить безопасные зоны и отображение edge-to-edge в приложениях на .NET 10+. Пригодится, если контент перекрывает системные панели или экранную клавиатуру. CX Codex +1 3 200установок maui-shell-navigation Скилл помогает настроить Shell-навигацию в .NET MAUI: вкладки, меню и переходы между страницами. Пригодится, когда нужно передавать параметры или подтвердить уход со страницы. CX Codex +1 3 100установок

Спонсоры проекта

Компании, которые помогают держать аналитику открытой