تفاوت Role و Policy در ASP.NET Core
تفاوت Policy و Role در Blazor
بیایید با یک مثال عملی در Blazor تفاوت Role و Policy را بررسی کنیم. فرض کنید جدول AspNetRoles
شامل رولهای زیر است:
۱. Role-Based Authorization (احراز هویت مبتنی بر نقش)
در این روش، دسترسیها مستقیماً بر اساس نام رول کاربر تعیین میشوند.
مثال:
// در یک کامپوننت Blazor
<AuthorizeView Roles="Administrator">
<h3>فقط مدیران این بخش را میبینند!</h3>
</AuthorizeView>
۲. Policy-Based Authorization (احراز هویت مبتنی بر پالیسی)
پالیسیها (Policy) ترکیبی از شرایط پیچیده هستند (مثلاً چند رول + قوانین سفارشی).
مثال: فرض کنید میخواهید کاربرانی اجازه ویرایش تنظیمات را داشته باشند که:
مرحله ۱: تعریف پالیسی در Program.cs
(یا Startup.cs
)
builder.Services.AddAuthorization(options =>
{
options.AddPolicy("EditSettings", policy =>
policy.RequireAssertion(context =>
{
bool isAdminOrOperator = context.User.IsInRole("Administrator") ||
context.User.IsInRole("Operator");
bool isNotSuspended = !context.User.IsInRole("Suspension");
return isAdminOrOperator && isNotSuspended;
}));
});
مرحله ۲: استفاده از پالیسی در کامپوننت Blazor
<AuthorizeView Policy="EditSettings">
<h3>فقط مدیران یا اپراتورهای غیرمسدود این بخش را میبینند!</h3>
</AuthorizeView>
تفاوت کلیدی:
ویژگی |
Role-Based |
Policy-Based |
انعطافپذیری |
فقط بر اساس نام رول |
ترکیب رولها + قوانین سفارشی (مثلاً عدم وجود رول خاص) |
مثال |
[Authorize(Roles = "Administrator")] |
[Authorize(Policy = "EditSettings")] |
کاربرد |
دسترسی ساده |
دسترسی پیشرفته (مثلاً چند شرطی) |
مثال واقعی از Policy:
فرض کنید میخواهید به کاربران Customer
اجازه دهید فقط اگر:
تعریف پالیسی:
options.AddPolicy("ActiveCustomer", policy =>
policy.RequireRole("Customer")
.RequireClaim("AccountVerified", "true")
.RequireAssertion(context => !context.User.IsInRole("Suspension")));
استفاده در کامپوننت:
<AuthorizeView Policy="ActiveCustomer">
<h3>مشتریان فعال این بخش را میبینند!</h3>
</AuthorizeView>
نتیجهگیری:
با استفاده از پالیسیها، میتوانید شرایط پیچیدهتری را برای دسترسی کاربران تعیین کنید که فقط با رولها ممکن نیست! 😊