ASP.NET Core Identityのスキャフォールディング構築

プロジェクト構築手順

認証方式選択時に「個人アカウント」を指定することで、SQL Server用の接続文字列が自動生成されます。

認証サービス構成方法の比較

  • AddIdentity
    • ユーザー管理機能やパスワードポリシーなど、認証機能の全般をカスタマイズ可能
    • Entity Framework Coreの設定やCookie認証の構成を明示的に指定する必要あり
    • 柔軟性が高いが設定作業が複雑化する傾向
  • AddDefaultIdentity
    • Entity Framework CoreとCookie認証を標準設定で自動構成
    • アカウント確認機能やセキュリティ設定がデフォルトで有効化
    • 迅速な実装を求めるケースに最適

サービス登録のコード例

using Microsoft.AspNetCore.Identity;
using Microsoft.EntityFrameworkCore;
using WebApp.Data;

var builder = WebApplication.CreateBuilder(args);

// データベース設定
var connection = builder.Configuration.GetConnectionString("DefaultConnection");
builder.Services.AddDbContext<AppDbContext>(options =>
    options.UseSqlServer(connection));
builder.Services.AddDatabaseDeveloperPageExceptionFilter();

// 認証サービス構成
builder.Services.AddDefaultIdentity<IdentityUser>(configureOptions: opts => {
    opts.SignIn.RequireConfirmedAccount = true;
})
.AddEntityFrameworkStores<AppDbContext>();

builder.Services.AddControllersWithViews();

プロジェクト構成要素

自動生成されるプロジェクトには以下のNuGetパッケージが含まれます:

  • Microsoft.AspNetCore.Identity.EntityFrameworkCore
  • Microsoft.EntityFrameworkCore.SqlServer
  • Microsoft.AspNetCore.Identity.UI

スキャフォールディング生成後の実装

基幹となる認証機能はAreas/Identity配下に配置されます。以下はナビゲーションバーの実装例:

@using Microsoft.AspNetCore.Identity
@inject SignInManager<IdentityUser> SignInManager
@inject UserManager<IdentityUser> UserManager

<ul class="navbar-nav">
@if (SignInManager.IsSignedIn(User))
{
    <li class="nav-item">
        <a class="nav-link text-dark" 
           asp-area="Identity" 
           asp-page="/Account/Manage/Index" 
           title="Manage">@User.Identity?.Name でログイン中</a>
    </li>
    <li class="nav-item">
        <form method="post" 
              asp-area="Identity" 
              asp-page="/Account/Logout">
            <button type="submit" class="nav-link btn btn-link text-dark">ログアウト</button>
        </form>
    </li>
}
else
{
    <li class="nav-item">
        <a class="nav-link text-dark" asp-area="Identity" asp-page="/Account/Register">登録</a>
    </li>
    <li class="nav-item">
        <a class="nav-link text-dark" asp-area="Identity" asp-page="/Account/Login">ログイン</a>
    </li>
}
</ul>

タグ: asp.net-core-identity entity-framework-core razor-pages dependency-injection authentication

6月9日 16:37 投稿