ASP.NET Core MVC の個別認証(Individual Accounts) を使ったアプリで、
管理者専用ページ を作るには、以下の流れで実装します。
1. ロール(Role)機能を有効化する
Program.cs(または )で Role 管理を有効にします。Startup.cs
using Microsoft.AspNetCore.Identity;
using Microsoft.EntityFrameworkCore;
using YourApp.Data; // ApplicationDbContext の名前空間
var builder = WebApplication.CreateBuilder(args);
// DB 接続設定
builder.Services.AddDbContext<ApplicationDbContext>(options =>
options.UseSqlServer(builder.Configuration.GetConnectionString("DefaultConnection")));
// Identity + Role サポート
builder.Services.AddDefaultIdentity<IdentityUser>(options => options.SignIn.RequireConfirmedAccount = true)
.AddRoles<IdentityRole>() // ★ これを追加
.AddEntityFrameworkStores<ApplicationDbContext>();
builder.Services.AddControllersWithViews();
var app = builder.Build();
// ルーティングなど
if (!app.Environment.IsDevelopment())
{
app.UseExceptionHandler("/Home/Error");
app.UseHsts();
}
app.UseHttpsRedirection();
app.UseStaticFiles();
app.UseRouting();
app.UseAuthentication(); // 認証
app.UseAuthorization(); // 認可
app.MapControllerRoute(
name: "default",
pattern: "{controller=Home}/{action=Index}/{id?}");
app.MapRazorPages();
app.Run();
2. 管理者ロールを作成する(初回のみ)
アプリ起動時に Admin ロールを自動作成し、特定ユーザーに割り当てます。
Data/SeedData.csを作成:
using Microsoft.AspNetCore.Identity;
namespace YourApp.Data
{
public static class SeedData
{
public static async Task InitializeAsync(IServiceProvider serviceProvider)
{
var roleManager = serviceProvider.GetRequiredService<RoleManager<IdentityRole>>();
var userManager = serviceProvider.GetRequiredService<UserManager<IdentityUser>>();
// Admin ロールがなければ作成
if (!await roleManager.RoleExistsAsync("Admin"))
{
await roleManager.CreateAsync(new IdentityRole("Admin"));
}
// 管理者ユーザーを作成(存在しない場合)
string adminEmail = "admin@example.com";
string adminPassword = "Admin@123";
var adminUser = await userManager.FindByEmailAsync(adminEmail);
if (adminUser == null)
{
adminUser = new IdentityUser { UserName = adminEmail, Email = adminEmail, EmailConfirmed = true };
var result = await userManager.CreateAsync(adminUser, adminPassword);
if (result.Succeeded)
{
await userManager.AddToRoleAsync(adminUser, "Admin");
}
}
}
}
}
Program.csの最後に追加:
using YourApp.Data;
using (var scope = app.Services.CreateScope())
{
var services = scope.ServiceProvider;
await SeedData.InitializeAsync(services);
}
3. 管理者専用コントローラーを作成
Controllers/AdminController.cs:
using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Mvc;
namespace YourApp.Controllers
{
[Authorize(Roles = "Admin")] // ★ Admin ロールのみアクセス可能
public class AdminController : Controller
{
public IActionResult Index()
{
return View();
}
}
}
4. 管理者専用ビューを作成
Views/Admin/Index.cshtml:
@{
ViewData["Title"] = "管理者ページ";
}
<h1>管理者専用ページ</h1>
<p>このページは Admin ロールのユーザーのみがアクセスできます。</p>
5. 動作確認
- アプリを起動
admin@example.com / Admin@123でログイン/Adminにアクセス → 表示される- 一般ユーザーでアクセス → 403 Forbidden になる
✅ ポイント
AddRoles<IdentityRole>()を忘れるとロール機能が使えません。- 初回起動時に でロールと管理者ユーザーを作成しておくと便利です。
SeedData [Authorize(Roles = "Admin")]を付けるだけでアクセス制御できます。
もし希望があれば、この 管理者専用ページ を
「ログイン後のナビゲーションメニューにだけ表示する」コードも追加できますが、
それも実装しますか?
そうすれば一般ユーザーにはリンク自体が見えなくなります。
Powered by Froala Editor