auth0-aspnetcore-authentication について
ASP.NET Core MVC、Razor Pages、Blazor Server 向けの Auth0 統合スキルです。Auth0.AspNetCore.Authentication によるログイン、ログアウト、プロフィール表示、セッション認証、ルート保護を案内します。
主な機能
- 01Auth0 のセッション認証設定
- 02ログインとログアウトの実装
- 03プロフィールとクレームの表示
- 04認証必須ルートの保護
- 05Blazor Server の統合手順
活用シーン
- 01ASP.NET Core サイトへの Auth0 ログイン追加
- 02プロフィール画面とナビゲーションの設定
- 03Blazor Server への認証エンドポイント統合
インストール
コマンドをコピーしてターミナルで実行します。
npx skills add https:/ / github.com/ auth0/ agent-skills --skill auth0-aspnetcore-authenticationインストール後、Claude Code で/auth0-aspnetcore-authenticationを入力して読み込まれたか確認します。
同梱ファイル
SKILL.md と一緒にインストールされる参考資料やスクリプト。
references/api.mdintegration.mdsetup.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 メソッド
| メソッド/プロパティ | 使用方法 | 目的 |
|---|---|---|
AddAuth0WebAppAuthentication | builder.Services.AddAuth0WebAppAuthentication(options => { ... }) | Auth0 の Cookie ベース認証を登録します |
LoginAuthenticationPropertiesBuilder | new LoginAuthenticationPropertiesBuilder().WithRedirectUri(url).Build() | ログインチャレンジ用のプロパティを構築します |
LogoutAuthenticationPropertiesBuilder | new LogoutAuthenticationPropertiesBuilder().WithRedirectUri(url).Build() | ログアウトリダイレクト用のプロパティを構築します |
ChallengeAsync | await 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.FindFirst | User.FindFirst(c => c.Type == "picture")?.Value | コントローラー/ビューで個々のユーザークレームにアクセスします |
User.Identity.IsAuthenticated | @if (User.Identity.IsAuthenticated) | ビュー/レイアウトで認証状態を確認します |
[Authorize] | コントローラーのアクションまたは Razor コンポーネントに付ける [Authorize] 属性 | 認証が必要なルートを保護します |
AddCascadingAuthenticationState | builder.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- アプリケーションのクライアント IDAuth0:ClientSecret- アプリケーションのクライアントシークレット(開発時はユーザーシークレットを使用してください)
詳細なドキュメント
- セットアップガイド - セットアップスクリプトの自動実行、認証情報の設定、Auth0 CLI の使用方法
- 統合ガイド - 保護されたルート、API の呼び出し、Blazor のパターン、エラー処理
- API リファレンス - SDK の完全な設定、ビルダーのオプション、クレームのリファレンス