هدف مقاله:
در پروژههای سازمانی یا اپلیکیشنهایی که مدیر باید کنترل کاملی روی کاربران داشته باشد، بهتر است فقط مدیر سیستم بتواند کاربران جدید را ثبتنام کند. بهعبارت دیگر، هیچ فرد ناشناسی نباید از بیرون به صفحهی ثبتنام دسترسی داشته باشد.
مشکلی که من داشتم...
من میخواستم پروژهام طوری باشد که فقط مدیر سیستم یا کسانی که او تعیین کرده، امکان ثبتنام کاربران جدید را داشته باشند. اما در حالت پیشفرض، صفحه ثبتنام (/Register
) برای همه کاربران در دسترس است، حتی برای کسانی که هنوز وارد نشدهاند!
در این آموزش، یاد میگیریم چطور این موضوع را کاملاً حل کنیم و فقط کاربرانی که نقش Admin
دارند اجازه ثبتنام دیگران را داشته باشند.
🛠 مرحله 1: ایجاد پروژه با Identity
اگر پروژه ندارید، ابتدا یک Razor Pages با احراز هویت ایجاد کنید:
dotnet new razor --auth Individual -n AdminOnlyRegister
cd AdminOnlyRegister
🔐 مرحله 2: محدود کردن صفحه Register فقط برای Admin
فایل زیر را باز کنید:
Areas/Identity/Pages/Account/Register.cshtml.cs
و این کد را در بالای کلاس قرار دهید:
using Microsoft.AspNetCore.Authorization;
[Authorize(Roles = "Admin")]
public class RegisterModel : PageModel
{
...
}
✅ این کار باعث میشود فقط کاربران دارای نقش Admin
بتوانند این صفحه را ببینند
🚫 مرحله 3: تنظیم مسیر Access Denied
در Program.cs
، مسیر زیر را برای عدم دسترسی اضافه کنید:
builder.Services.ConfigureApplicationCookie(options =>
{
options.AccessDeniedPath = "/Identity/Account/AccessDenied";
});
🧠 مرحله 4: ایجاد نقش Admin و اختصاص آن به کاربر
یک کلاس جدید بنام SeedData.cs
بسازید:
public static class SeedData
{
public static async Task Initialize(IServiceProvider serviceProvider)
{
var userManager = serviceProvider.GetRequiredService<UserManager<IdentityUser>>();
var roleManager = serviceProvider.GetRequiredService<RoleManager<IdentityRole>>();
string adminEmail = "admin@example.com";
string adminPassword = "Admin@123";
if (!await roleManager.RoleExistsAsync("Admin"))
{
await roleManager.CreateAsync(new IdentityRole("Admin"));
}
var adminUser = await userManager.FindByEmailAsync(adminEmail);
if (adminUser == null)
{
adminUser = new IdentityUser { UserName = adminEmail, Email = adminEmail, EmailConfirmed = true };
await userManager.CreateAsync(adminUser, adminPassword);
}
if (!await userManager.IsInRoleAsync(adminUser, "Admin"))
{
await userManager.AddToRoleAsync(adminUser, "Admin");
}
}
}
و سپس در Program.cs
بعد از app.Run();
، این را اضافه کنید:
using (var scope = app.Services.CreateScope())
{
var services = scope.ServiceProvider;
await SeedData.Initialize(services);
}
🧼 مرحله 5: حذف لینک ثبتنام از کاربران عمومی
در فایل _LoginPartial.cshtml
یا هر جای دیگری که لینک ثبتنام وجود دارد، بررسی کنید که فقط کاربران Admin آن را ببینند:
@if (User.IsInRole("Admin"))
{
<a asp-area="Identity" asp-page="/Account/Register">ثبتنام</a>
}
✅ جمعبندی
-
کاربران عمومی دیگر نمیتوانند ثبتنام کنند
-
فقط مدیر با نقش
Admin
میتواند کاربر جدید بسازد -
کنترل دسترسی به شیوهای حرفهای و امن پیادهسازی شده است