認証はリクエスト元の真正性を確認するプロセスであり、ログインとログアウトという2つの基本操作を伴います。ASP.NET Coreの認証システムは「認証チケット」を基盤としており、次の3つの主要操作で構成されます。
認証チケットの仕組み
認証処理はAuthenticationMiddlewareで実装され、指定された認証スキームに従ってリクエストからセキュリティトークンを抽出します。ASP.NET Coreではこのトークンを認証チケットと呼び、以下の3つの操作が存在します:
- 発行:ログイン時にユーザー証明書を検証後、ID情報を含むチケットを生成
- 検証:リクエストで送信されたチケットの有効性を確認
- 無効化:ログアウト時にチケットを失効させる
認証設定の実装
var builder = WebApplication.CreateBuilder(args);
// 認証サービスの登録
builder.Services.AddAuthentication(config =>
{
config.DefaultScheme = CookieAuthenticationDefaults.AuthenticationScheme;
}).AddCookie(options =>
{
options.LoginPath = "/auth/Login";
options.LogoutPath = "/auth/Logout";
});
var app = builder.Build();
app.UseAuthentication();
app.UseRouting();
// エンドポイント設定
app.Map("/", AuthController.ShowHomePage);
app.Map("/auth/Login", AuthController.ProcessLogin);
app.Map("/auth/Logout", AuthController.ProcessLogout);
app.Run();
認証処理の実装例
public class AuthController
{
public static async Task ShowHomePage(HttpContext ctx)
{
if (ctx.User?.Identity?.IsAuthenticated == true)
{
ctx.Response.ContentType = "text/html;charset=utf-8";
var html = $"<html><body>" +
$"<p>認証済み: {ctx.User.Identity.Name}</p>" +
$"<a href='/auth/Logout'>ログアウト</a>" +
$"</body></html>";
await ctx.Response.WriteAsync(html);
}
else
{
await ctx.ChallengeAsync();
}
}
public static async Task ProcessLogin(HttpContext ctx)
{
if (ctx.Request.Method == "GET")
{
ctx.Response.ContentType = "text/html;charset=utf-8";
var loginForm = "<form method='post'>" +
"ユーザー名: <input name='username'><br>" +
"パスワード: <input type='password' name='passwd'><br>" +
"<button type='submit'>送信</button>" +
"</form>";
await ctx.Response.WriteAsync(loginForm);
}
else
{
var user = ctx.Request.Form["username"];
var password = ctx.Request.Form["passwd"];
if (user == "admin" && password == "admin123")
{
var identity = new ClaimsIdentity(CookieAuthenticationDefaults.AuthenticationScheme);
identity.AddClaim(new Claim(ClaimTypes.Name, user));
await ctx.SignInAsync(new ClaimsPrincipal(identity));
ctx.Response.Redirect("/");
}
else
{
await ShowHomePage(ctx);
}
}
}
public static async Task ProcessLogout(HttpContext ctx)
{
await ctx.SignOutAsync();
ctx.Response.Redirect("/");
}
}
動作フロー解説
- 未認証ユーザーがルート(/)にアクセスするとChallengeAsyncが自動的に/auth/Loginへリダイレクト
- ログインフォームで正しい資格情報を送信するとSignInAsyncで認証チケットを発行
- 認証成功後、元のリクエストURLへリダイレクト(ReturnUrlパラメータで制御)
- ログアウトリクエストでSignOutAsyncを呼び出し認証チケットを無効化
Cookie認証のデフォルト設定はCookieAuthenticationDefaultsクラスで定義されており、LoginPathやLogoutPathのカスタマイズが可能です。AuthenticationMiddlewareはリクエスト処理パイプラインで認証状態を管理し、HttpContext.Userに認証情報を設定します。