ASP.NET Core 認証の基本実装

認証はリクエスト元の真正性を確認するプロセスであり、ログインとログアウトという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("/");
    }
}

動作フロー解説

  1. 未認証ユーザーがルート(/)にアクセスするとChallengeAsyncが自動的に/auth/Loginへリダイレクト
  2. ログインフォームで正しい資格情報を送信するとSignInAsyncで認証チケットを発行
  3. 認証成功後、元のリクエストURLへリダイレクト(ReturnUrlパラメータで制御)
  4. ログアウトリクエストでSignOutAsyncを呼び出し認証チケットを無効化

Cookie認証のデフォルト設定はCookieAuthenticationDefaultsクラスで定義されており、LoginPathやLogoutPathのカスタマイズが可能です。AuthenticationMiddlewareはリクエスト処理パイプラインで認証状態を管理し、HttpContext.Userに認証情報を設定します。

タグ: ASP.NET Core 認証チケット Cookie認証 AuthenticationMiddleware 認証スキーム

6月28日 21:09 投稿