記事詳細


投稿日
2025年11月22日09時09分
タイトル

認証アプリでユーザー毎のデータベース作成

内容

検索Word:asp.net mvc :認証アプリでユーザー毎が使用するデータベースを構築するには?

ASP.NET MVC(または ASP.NET Core MVC)で「ユーザーごとに異なるデータベースを使う」構成を作る場合、設計パターンはいくつかあります。
これは マルチテナント(Multi-Tenant)アーキテクチャ の一種で、特に「DB分離型(Database-per-User / Database-per-Tenant)」に該当します。

1. 基本的な考え方

  • 認証(ASP.NET Identity など)でユーザーを特定
  • ログイン後、そのユーザーに紐づく 接続文字列(Connection String) を取得
  • DbContext を動的に構築して、そのユーザー専用のDBに接続

2. 実装パターン

パターンA:ユーザーごとに接続文字列を持つ

  1. 共通の認証DB(例:AuthDb)を用意し、AspNetUsers テーブルに ConnectionString カラムを追加
  2. ログイン後、User.Identity.Name または UserManager からユーザー情報を取得
  3. そのユーザーの接続文字列を使って DbContext を生成

サンプルコード(ASP.NET Core MVC + EF Core)

// ユーザー情報に接続文字列を持たせるモデル拡張
public class ApplicationUser : IdentityUser
{
    public string ConnectionString { get; set; }
}

// 動的にDbContextを生成するファクトリ
public class TenantDbContextFactory
{
    public TenantDbContext Create(string connectionString)
    {
        var options = new DbContextOptionsBuilder<TenantDbContext>()
            .UseSqlServer(connectionString)
            .Options;

        return new TenantDbContext(options);
    }
}

// ユーザー専用のDbContext
public class TenantDbContext : DbContext
{
    public TenantDbContext(DbContextOptions<TenantDbContext> options)
        : base(options) { }

    public DbSet<Product> Products { get; set; }
}

// コントローラ例
public class ProductsController : Controller
{
    private readonly UserManager<ApplicationUser> _userManager;
    private readonly TenantDbContextFactory _dbFactory;

    public ProductsController(UserManager<ApplicationUser> userManager, TenantDbContextFactory dbFactory)
    {
        _userManager = userManager;
        _dbFactory = dbFactory;
    }

    public async Task<IActionResult> Index()
    {
        var user = await _userManager.GetUserAsync(User);
        if (user == null || string.IsNullOrEmpty(user.ConnectionString))
        {
            return Unauthorized();
        }

        using var db = _dbFactory.Create(user.ConnectionString);
        var products = await db.Products.ToListAsync();
        return View(products);
    }
}

パターンB:DB名だけを切り替える

  • 接続文字列のテンプレートを appsettings.json に置き、ユーザーごとにDB名を差し替える
{
  "ConnectionStrings": {
    "TenantTemplate": "Server=.;Database={DBNAME};Trusted_Connection=True;"
  }
}
  • ログイン後に {DBNAME} をユーザー固有の値に置換して DbContext を生成

パターンC:スキーマ分離(1DB内でユーザーごとにスキーマを分ける)

  • DBは1つだが、ユーザーごとに異なるスキーマを使う
  • 接続文字列は共通だが、OnModelCreating でスキーマを切り替える

3. 注意点

  • 接続プール:ユーザーごとに異なる接続文字列を使うと、接続プールが分かれるためメモリ消費が増える
  • マイグレーション管理:ユーザーごとにDBを作る場合、マイグレーションを自動適用する仕組みが必要
  • セキュリティ:接続文字列は暗号化して保存(例:Azure Key Vault、User Secrets)
  • スケーラビリティ:ユーザー数が多い場合、DB数が増えすぎると管理が困難になる

✅ おすすめ構成

  • ユーザー数が少ない → DB分離型(パターンA)
  • ユーザー数が多い → スキーマ分離型(パターンC) または テーブル分離型

もし希望があれば、この仕組みを ASP.NET Core Identity + EF Core で「ログイン後に自動でユーザー専用DBを作成する」コードも作れます。
これを実装すると、初回ログイン時にDBが自動生成されるようになります。

作りますか?

Powered by Froala Editor

添付画像

画像はありません
Genreのカテゴリ-名
Databases
編集 | 記事一覧