سلام خدمت استاد عزیز و همه دوستان.
کدهای PermissionCheckerAttribute:
using Microsoft.AspNetCore.Mvc.Filters;
using ShopStock.Application.Extentions;
using ShopStock.Application.Services.Interfaces;
namespace ShopStock.Web.Attributes
{
[AttributeUsage(AttributeTargets.Class | AttributeTargets.Method)]
public class PermissionCheckerAttribute(string permissionName)
: Attribute, IAsyncAuthorizationFilter
{
public async Task OnAuthorizationAsync(AuthorizationFilterContext context)
{
var userService = context.HttpContext.RequestServices.GetService<IUserService>();
if (context.HttpContext.User.Identity.IsAuthenticated)
{
int userId = context.HttpContext.User.GetUserId();
var hasPermission = await userService.CheckUserPermissionForAdminAsync(userId, permissionName);
if (hasPermission == false)
{
context.HttpContext.Response.StatusCode = StatusCodes.Status403Forbidden;
context.HttpContext.Response.Redirect("/Admin/Home/AccessDenied");
}
else
{
// اجازه ادامه مسیر
}
}
else
{
context.HttpContext.Response.StatusCode = StatusCodes.Status403Forbidden;
context.HttpContext.Response.Redirect("/Admin/Home/AccessDenied");
}
}
}
}
مشکلی که در این کد ها وجود دارد مربوط به StatusCodes.Status403Forbidden و Redirect ها هستند.
اگر کاربری بدون سطح دسترسی به کنترلر نمایش محصولات (Admin/Products/Index) یا کنترلر حذف یک محصول (Admin/Products/Delete/5) و یا هر کنترلر دیگری که سطح دسترسی برای آن تعریف شده است، کنترلرهای مذکور را فراخوانی کند در هر صورت در نهایت به صفحه AccessDenied ریدایرکت میشود اما قبل از این هدایت کنترلر مذکور (Admin/Products/Index یا Admin/Products/Delete/5) اجرا میشود. پس ممکن است که کاربری که هیچ دسترسی ای به یک کنترلر ندارد باعث اجرای کدهای داخل آن کنترلر شود.
نکته این است که صرفا با تنظیم StatusCodes.Status403Forbidde ، کنترلر اصلی در هر صورت بازم اجرا میشه و بعد به 302 ریدایرکت میشه.(تغییر کد از 403 به 302)
البته این نظر من هست و تو کد هم تست کردم همین نتیجه رو داد و از هوش مصنوعی هم چند بار پرسیدم بازم تاکید میکرد که همین اتفاق میفته و بهتره که با
context.Result = new ForbidResult();مسیر دسترسی به کنترلر به صورت مطلق قطع بشه.
با تشکر