چگونه میتوان یک AuthorizeAttribute سفارشی در ASP.NET Core ایجاد کرد؟
در حال حاضر، برای ایجاد یک AuthorizeAttribute سفارشی در ASP.NET Core، روشهای جدیدی نسبت به نسخههای قبلی این فریمورک وجود دارد.
ابتدا باید از [Authorize]
برای مشخص کردن سیاستهای خود استفاده کنید. مثلاً:
[Authorize(Policy = "YouNeedToBe18ToDoThis")]
این سیاست باید در Startup.cs
برنامه ثبت شود. برای مثال، اگر بخواهید برای یک تابع خاص، شرطی نظیر سن را بررسی کنید، باید سیاستی با نام مربوطه بسازید که در آن سن کاربر را چک کند.
در عین حال، استفاده از سیاستها ممکن است در برخی موارد مناسب نباشد، به ویژه زمانی که بخواهید مجوزهای پیچیدهتری مشخص کنید. به عنوان مثال، در سناریوهایی که شما میخواهید بررسی کنید که آیا کاربر دارای مجوز خاصی برای دسترسی به یک منبع است یا خیر، ممکن است نیاز به راهحلهای سفارشیتری داشته باشید.
یکی از روشها برای پیادهسازی مجوز خصوصی، استفاده از IAuthorizationFilter
است. با این کار، شما میتوانید یک فیلتر سفارشی برای بررسی مجوزها بنویسید. در اینجا یک پیادهسازی نمونه آورده شده است:
public class ClaimRequirementAttribute : TypeFilterAttribute
{
public ClaimRequirementAttribute(string claimType, string claimValue) : base(typeof(ClaimRequirementFilter))
{
Arguments = new object[] { new Claim(claimType, claimValue) };
}
}
public class ClaimRequirementFilter : IAuthorizationFilter
{
private readonly Claim _claim;
public ClaimRequirementFilter(Claim claim)
{
_claim = claim;
}
public void OnAuthorization(AuthorizationFilterContext context)
{
var hasClaim = context.HttpContext.User.Claims.Any(c => c.Type == _claim.Type && c.Value == _claim.Value);
if (!hasClaim)
{
context.Result = new ForbidResult();
}
}
}
در این کد، ClaimRequirementAttribute
حاوی تنظیمات مربوط به بررسی مجوز است و ClaimRequirementFilter نیز پیاده سازی برررسی این مجوز است.
همچنین میتوانید با ایجاد یک کلاس مجوز مانند CustomAuthorizeAttribute
، به این نحو از آن برای بررسیهای خاص استفاده کنید. این کلاس میتواند از AuthorizeAttribute
ارثبری کرده و با پیادهسازی IAuthorizationFilter
منطق مورد نظر خود را اضافه کند:
[AttributeUsage(AttributeTargets.Class | AttributeTargets.Method, AllowMultiple = true, Inherited = true)]
public class CustomAuthorizeAttribute : AuthorizeAttribute, IAuthorizationFilter
{
private readonly string _someFilterParameter;
public CustomAuthorizeAttribute(string someFilterParameter)
{
_someFilterParameter = someFilterParameter;
}
public void OnAuthorization(AuthorizationFilterContext context)
{
var user = context.HttpContext.User;
if (!user.Identity.IsAuthenticated)
{
return;
}
var someService = context.HttpContext.RequestServices.GetService<ISomeService>();
var isAuthorized = someService.IsUserAuthorized(user.Identity.Name, _someFilterParameter);
if (!isAuthorized)
{
context.Result = new StatusCodeResult((int)System.Net.HttpStatusCode.Forbidden);
}
}
}
این کلاس میتواند به شما این امکان را بدهد تا مجوزهای پیچیدهتری را بر اساس نیازهای خاص خود اعمال کنید. به هرحال، توصیه میشود از استفاده از AuthorizeAttributeهای سفارشی تا حد امکان اجتناب کنید و به جای آن از الگوهای مجوز موجود استفاده کنید که در حال حاضر در ASP.NET Core موجود است.