記事詳細
- 投稿日
- 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:ユーザーごとに接続文字列を持つ
- 共通の認証DB(例:
AuthDb)を用意し、AspNetUsersテーブルにConnectionStringカラムを追加 - ログイン後、
User.Identity.NameまたはUserManagerからユーザー情報を取得 - そのユーザーの接続文字列を使って
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