mcpField
A
auth0-aspnetcore-authentication

auth0-aspnetcore-authentication

github.com/auth0セキュリティ55309 回インストール1 日前に更新
リポジトリ

auth0-aspnetcore-authentication について

ASP.NET Core MVC、Razor Pages、Blazor Server 向けの Auth0 統合スキルです。Auth0.AspNetCore.Authentication によるログイン、ログアウト、プロフィール表示、セッション認証、ルート保護を案内します。

主な機能

  1. 01Auth0 のセッション認証設定
  2. 02ログインとログアウトの実装
  3. 03プロフィールとクレームの表示
  4. 04認証必須ルートの保護
  5. 05Blazor Server の統合手順

活用シーン

  1. 01ASP.NET Core サイトへの Auth0 ログイン追加
  2. 02プロフィール画面とナビゲーションの設定
  3. 03Blazor Server への認証エンドポイント統合

インストール

コマンドをコピーしてターミナルで実行します。

$npx skills add https://github.com/auth0/agent-skills --skill auth0-aspnetcore-authentication

インストール後、Claude Code で/auth0-aspnetcore-authenticationを入力して読み込まれたか確認します。

同梱ファイル

SKILL.md と一緒にインストールされる参考資料やスクリプト。

references/
api.md
integration.md
setup.md

詳細

Auth0 ASP.NET Core Web アプリの統合

Auth0.AspNetCore.Authentication を使用して、ASP.NET Core MVC、Razor Pages、または Blazor Server アプリケーションにログイン、ログアウト、ユーザープロフィールを追加します。


前提条件

  • ASP.NET Core アプリケーション(.NET 8 以降)
  • Auth0 Regular Web Application を設定済み(API ではなく、Application である必要があります)
  • Auth0 をまだ設定していない場合は、まず auth0-quickstart スキルを使用してください

使用しないケース

  • JWT Bearer 検証を行う ASP.NET Core Web API - JWT で保護された REST API には auth0-aspnetcore-api を使用してください
  • Blazor WebAssembly - OIDC クライアントサイド認証が必要です。Auth0 Blazor WebAssembly クイックスタートを参照してください
  • シングルページアプリケーション - クライアントサイド認証には auth0-react、auth0-vue、または auth0-angular を使用してください
  • Next.js アプリケーション - クライアントとサーバーの両方に対応する auth0-nextjs を使用してください
  • Python Web アプリ - Flask には auth0-flask を使用するか、Django クイックスタートを参照してください

クイックスタートのワークフロー

1. SDK をインストールする
dotnet add package Auth0.AspNetCore.Authentication
2. 認証情報を設定する

appsettings.json に Auth0 の設定を追加します。

{
  "Auth0": {
    "Domain": "your-tenant.us.auth0.com",
    "ClientId": "your_client_id",
    "ClientSecret": "your_client_secret"
  }
}

ローカル開発の場合は、シークレットをソース管理から除外してください。ClientSecret のコミットを避けるには、dotnet user-secrets を使用します。

dotnet user-secrets set "Auth0:Domain" "your-tenant.us.auth0.com"
dotnet user-secrets set "Auth0:ClientId" "your_client_id"
dotnet user-secrets set "Auth0:ClientSecret" "your_client_secret"

Auth0:Domain はテナントのドメイン(https:// を除く)です。Auth0:ClientId と Auth0:ClientSecret は Auth0 Application の設定で確認できます。

3. Auth0 ダッシュボードを設定する

Auth0 Application の設定で、次の値を指定します。

  • 許可されたコールバック URL:http://localhost:5000/callback
  • 許可されたログアウト URL:http://localhost:5000
  • 許可された Web オリジン:http://localhost:5000
4. Program.cs に Auth0 を登録する
using Auth0.AspNetCore.Authentication;

var builder = WebApplication.CreateBuilder(args);

builder.Services.AddAuth0WebAppAuthentication(options =>
{
    options.Domain = builder.Configuration["Auth0:Domain"];
    options.ClientId = builder.Configuration["Auth0:ClientId"];
    options.ClientSecret = builder.Configuration["Auth0:ClientSecret"];
});

builder.Services.AddControllersWithViews();

var app = builder.Build();

// Standard middleware...
app.UseHttpsRedirection();
app.UseStaticFiles();
app.UseRouting();

app.UseAuthentication();    // Must come before UseAuthorization
app.UseAuthorization();     // Critical: order matters

app.MapControllerRoute(
    name: "default",
    pattern: "{controller=Home}/{action=Index}/{id?}");

app.Run();

重要: UseAuthentication() は UseAuthorization() より前に呼び出す必要があります。順序を逆にすると、保護されたルートで認証チャレンジが行われず、認証に関する問題が何も通知されないまま発生します。

5. AccountController を作成する
using Auth0.AspNetCore.Authentication;
using Microsoft.AspNetCore.Authentication;
using Microsoft.AspNetCore.Authentication.Cookies;
using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Mvc;

public class AccountController : Controller
{
    public async Task Login(string returnUrl = "/")
    {
        var authenticationProperties = new LoginAuthenticationPropertiesBuilder()
            .WithRedirectUri(returnUrl)
            .Build();

        await HttpContext.ChallengeAsync(Auth0Constants.AuthenticationScheme, authenticationProperties);
    }

    [Authorize]
    public async Task Logout()
    {
        var authenticationProperties = new LogoutAuthenticationPropertiesBuilder()
            .WithRedirectUri(Url.Action("Index", "Home"))
            .Build();

        await HttpContext.SignOutAsync(Auth0Constants.AuthenticationScheme, authenticationProperties);
        await HttpContext.SignOutAsync(CookieAuthenticationDefaults.AuthenticationScheme);
    }

    [Authorize]
    public IActionResult Profile()
    {
        return View();
    }
}

Login に [Authorize] は不要です。未認証ユーザーがアクセスする入口となるためです。Logout には [Authorize] が必要です。これにより、認証済みセッションに対してのみサインアウトが実行されます。必ず両方の SignOutAsync メソッドを呼び出してください。 Auth0 スキームのみからサインアウトするとローカル Cookie が残り、Cookie スキームのみからサインアウトすると Auth0 のログアウト URL がスキップされます。

6. プロフィールビューを作成する

Views/Account/Profile.cshtml を作成します。

@{
    ViewData["Title"] = "User Profile";
}

<div class="row">
    <div class="col-md-2">
        <img src="@User.FindFirst(c => c.Type == "picture")?.Value"
             alt="Profile picture" class="img-fluid rounded-circle" />
    </div>
    <div class="col-md-10">
        <h3>@User.Identity.Name</h3>
        <p><strong>Email:</strong>
           @User.FindFirst(c => c.Type == System.Security.Claims.ClaimTypes.Email)?.Value</p>
        <p><strong>User ID:</strong>
           @User.FindFirst(c => c.Type == System.Security.Claims.ClaimTypes.NameIdentifier)?.Value</p>
    </div>
</div>

<h4 class="mt-4">Claims</h4>
<table class="table">
    <thead><tr><th>Claim Type</th><th>Claim Value</th></tr></thead>
    <tbody>
        @foreach (var claim in User.Claims)
        {
            <tr><td>@claim.Type</td><td>@claim.Value</td></tr>
        }
    </tbody>
</table>
7. ナビゲーションを更新する(_Layout.cshtml)

_Layout.cshtml 内のナビゲーションバーに、ログイン、ログアウト、プロフィールへのリンクを追加します。

@if (User.Identity.IsAuthenticated)
{
    <li class="nav-item">
        <a class="nav-link text-dark" asp-controller="Account" asp-action="Profile">@User.Identity.Name</a>
    </li>
    <li class="nav-item">
        <a class="nav-link text-dark" asp-controller="Account" asp-action="Logout">Logout</a>
    </li>
}
else
{
    <li class="nav-item">
        <a class="nav-link text-dark" asp-controller="Account" asp-action="Login">Login</a>
    </li>
}
8. アプリをテストする
dotnet run

http://localhost:5000 にアクセスし、Login をクリックして Auth0 のログインフローを開始します。


Blazor Server の場合

Blazor Server アプリでは、認証エンドポイントに Razor Pages を使用してください。Blazor コンポーネントでは、OAuth チャレンジに必要な HTTP リダイレクトを実行できません。

Program.cs の追加設定
using Auth0.AspNetCore.Authentication;

var builder = WebApplication.CreateBuilder(args);

builder.Services.AddAuth0WebAppAuthentication(options =>
{
    options.Domain = builder.Configuration["Auth0:Domain"];
    options.ClientId = builder.Configuration["Auth0:ClientId"];
    options.ClientSecret = builder.Configuration["Auth0:ClientSecret"];
});

builder.Services.AddRazorComponents()
    .AddInteractiveServerComponents();

builder.Services.AddCascadingAuthenticationState();  // Required for Blazor auth state
builder.Services.AddRazorPages();                     // Required for auth endpoints

var app = builder.Build();

app.UseAuthentication();
app.UseAuthorization();

app.MapRazorPages();
app.MapRazorComponents<App>()
    .AddInteractiveServerRenderMode();

app.Run();
ログイン用 Razor Page(Pages/Login.cshtml.cs)
using Auth0.AspNetCore.Authentication;
using Microsoft.AspNetCore.Authentication;
using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.Mvc.RazorPages;

public class LoginModel : PageModel
{
    public async Task OnGet(string returnUrl = "/")
    {
        var authenticationProperties = new LoginAuthenticationPropertiesBuilder()
            .WithRedirectUri(returnUrl)
            .Build();

        await HttpContext.ChallengeAsync(Auth0Constants.AuthenticationScheme, authenticationProperties);
    }
}
ログアウト用 Razor Page(Pages/Logout.cshtml.cs)
using Auth0.AspNetCore.Authentication;
using Microsoft.AspNetCore.Authentication;
using Microsoft.AspNetCore.Authentication.Cookies;
using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.Mvc.RazorPages;

public class LogoutModel : PageModel
{
    public async Task OnGet()
    {
        var authenticationProperties = new LogoutAuthenticationPropertiesBuilder()
            .WithRedirectUri(Url.Content("~/"))
            .Build();

        await HttpContext.SignOutAsync(Auth0Constants.AuthenticationScheme, authenticationProperties);
        await HttpContext.SignOutAsync(CookieAuthenticationDefaults.AuthenticationScheme);
    }
}
プロフィールコンポーネント(Components/Pages/Profile.razor)
@page "/profile"
@attribute [Authorize]
@using System.Security.Claims

<h1>Profile</h1>

<AuthorizeView>
    <Authorized>
        <div class="row">
            <div class="col-2">
                <img src="@context.User.FindFirst("picture")?.Value"
                     alt="Profile" class="img-fluid rounded-circle" />
            </div>
            <div class="col-10">
                <h3>@context.User.Identity?.Name</h3>
                <p><strong>Email:</strong> @context.User.FindFirst(ClaimTypes.Email)?.Value</p>
            </div>
        </div>

        <h4 class="mt-4">Claims</h4>
        <table class="table">
            <thead><tr><th>Type</th><th>Value</th></tr></thead>
            <tbody>
                @foreach (var claim in context.User.Claims)
                {
                    <tr><td>@claim.Type</td><td>@claim.Value</td></tr>
                }
            </tbody>
        </table>
    </Authorized>
</AuthorizeView>
MainLayout.razor のナビゲーションを更新する
@using Microsoft.AspNetCore.Components.Authorization

<AuthorizeView>
    <Authorized>
        <a href="/profile">@context.User.Identity?.Name</a>
        <a href="/Logout">Logout</a>
    </Authorized>
    <NotAuthorized>
        <a href="/Login">Login</a>
    </NotAuthorized>
</AuthorizeView>
Routes.razor

Router を CascadingAuthenticationState でラップして、コンポーネントツリー全体で認可を有効にします。

<CascadingAuthenticationState>
    <Router AppAssembly="typeof(Program).Assembly">
        <Found Context="routeData">
            <AuthorizeRouteView RouteData="routeData" DefaultLayout="typeof(Layout.MainLayout)" />
            <FocusOnNavigate RouteData="routeData" Selector="h1" />
        </Found>
    </Router>
</CascadingAuthenticationState>

Razor Pages の場合

Razor Pages アプリ(Blazor なし)では、Program.cs で AddControllersWithViews() の代わりに AddRazorPages() を使用してください。認証エンドポイントには、Blazor Server のセクションで示したものと同じ Login/Logout ページモデルを使用します。_Layout.cshtml のナビゲーションは、MVC のセクションで示した User.Identity.IsAuthenticated のチェックを使って置き換えてください。


よくある間違い

間違い修正方法
Domain、ClientId、または ClientSecret をソースコードにハードコーディングする設定から読み込みます。builder.Configuration["Auth0:Domain"] を使用し、認証情報を埋め込まないでください
ClientSecret をソース管理にコミットするクライアントシークレットには dotnet user-secrets または環境変数を使用し、決してコミットしないでください
UseAuthorization() を UseAuthentication() より先に呼び出す必ず先に UseAuthentication() を呼び出してください。順序を間違えると、認証が実行されません
1 つのスキームだけからサインアウトする必ず SignOutAsync(Auth0Constants.AuthenticationScheme) と SignOutAsync(CookieAuthenticationDefaults.AuthenticationScheme) の両方を呼び出してください
Login アクションに [Authorize] を追加するLogin は未認証ユーザーからアクセスできる必要があります。[Authorize] は Logout と Profile にのみ適用してください
Auth0 ダッシュボードでコールバック URL を設定しないAllowed Callback URLs に http://localhost:5000/callback を追加する必要があります
https:// プレフィックス付きで Domain を渡すDomain はプレフィックスのないドメインにします。例:my-tenant.us.auth0.com。https://my-tenant.us.auth0.com ではありません
Blazor で AddCascadingAuthenticationState() を追加しないBlazor Server では必須です。追加しないと、AuthorizeView と [Authorize] 属性に認証コンテキストが設定されません
ログイン/ログアウトのリダイレクトに Blazor コンポーネントを使用するBlazor コンポーネントでは HTTP リダイレクトを実行できません。認証エンドポイントには Razor Pages(/Login、/Logout)を使用してください
Blazor で AddRazorPages() と MapRazorPages() を追加しないこれらの登録がないと、ログインとログアウトの Razor Pages はルーティングされません
Web アプリで Auth0.AspNetCore.Authentication.Api を使用するこのパッケージは JWT で保護された API 用です。セッションベースの Web アプリには Auth0.AspNetCore.Authentication を使用してください
AddAuth0WebAppAuthentication の代わりに AddJwtBearer を使用するAddJwtBearer はステートレスな API 認証用です。セッションベースの Web アプリには AddAuth0WebAppAuthentication が必要です
Profile ビュー用の Views/Account/ ディレクトリを作成しないMVC では、ビューを作成する前にこのディレクトリが存在している必要があります

主な SDK メソッド

メソッド/プロパティ使用方法目的
AddAuth0WebAppAuthenticationbuilder.Services.AddAuth0WebAppAuthentication(options => { ... })Auth0 の Cookie ベース認証を登録します
LoginAuthenticationPropertiesBuildernew LoginAuthenticationPropertiesBuilder().WithRedirectUri(url).Build()ログインチャレンジ用のプロパティを構築します
LogoutAuthenticationPropertiesBuildernew LogoutAuthenticationPropertiesBuilder().WithRedirectUri(url).Build()ログアウトリダイレクト用のプロパティを構築します
ChallengeAsyncawait HttpContext.ChallengeAsync(Auth0Constants.AuthenticationScheme, props)Auth0 Universal Login へのリダイレクトを開始します
SignOutAsync(Auth0)await HttpContext.SignOutAsync(Auth0Constants.AuthenticationScheme, props)Auth0 からサインアウトし、ログアウト URL にリダイレクトします
SignOutAsync(Cookie)await HttpContext.SignOutAsync(CookieAuthenticationDefaults.AuthenticationScheme)ローカルのセッション Cookie をクリアします
User.FindFirstUser.FindFirst(c => c.Type == "picture")?.Valueコントローラー/ビューで個々のユーザークレームにアクセスします
User.Identity.IsAuthenticated@if (User.Identity.IsAuthenticated)ビュー/レイアウトで認証状態を確認します
[Authorize]コントローラーのアクションまたは Razor コンポーネントに付ける [Authorize] 属性認証が必要なルートを保護します
AddCascadingAuthenticationStatebuilder.Services.AddCascadingAuthenticationState()Blazor Server で認証状態を伝播するために必要です

関連スキル

  • auth0-aspnetcore-api - JWT Bearer トークン検証を使用する ASP.NET Core Web API 向け
  • auth0-express - ログイン/ログアウトのセッションを備えたサーバーレンダリング型 Express Web アプリ向け
  • auth0-flask - セッションベースの認証を備えた Flask Web アプリケーション向け

クイックリファレンス

SDK の登録:

builder.Services.AddAuth0WebAppAuthentication(options =>
{
    options.Domain = builder.Configuration["Auth0:Domain"];        // required
    options.ClientId = builder.Configuration["Auth0:ClientId"];    // required
    options.ClientSecret = builder.Configuration["Auth0:ClientSecret"]; // required
});

ログインアクション:

var props = new LoginAuthenticationPropertiesBuilder().WithRedirectUri(returnUrl).Build();
await HttpContext.ChallengeAsync(Auth0Constants.AuthenticationScheme, props);

ログアウトアクション(必ず両方呼び出してください):

var props = new LogoutAuthenticationPropertiesBuilder().WithRedirectUri(Url.Action("Index", "Home")).Build();
await HttpContext.SignOutAsync(Auth0Constants.AuthenticationScheme, props);
await HttpContext.SignOutAsync(CookieAuthenticationDefaults.AuthenticationScheme);

ルートの保護:

[Authorize]
public IActionResult Profile() { return View(); }

appsettings.json の設定キー:

  • Auth0:Domain - Auth0 テナントのドメイン(例:tenant.us.auth0.com)
  • Auth0:ClientId - アプリケーションのクライアント ID
  • Auth0:ClientSecret - アプリケーションのクライアントシークレット(開発時はユーザーシークレットを使用してください)

詳細なドキュメント

  • セットアップガイド - セットアップスクリプトの自動実行、認証情報の設定、Auth0 CLI の使用方法
  • 統合ガイド - 保護されたルート、API の呼び出し、Blazor のパターン、エラー処理
  • API リファレンス - SDK の完全な設定、ビルダーのオプション、クレームのリファレンス

参考資料

コメント