Показать страницу ошибки 404 после сбоя [Authorize]
У меня есть действие, которое я хочу ограничить только ролью "Admin". Я сделал это так:
[Authorize(Roles = "Admin")]
public ActionResult Edit(int id)
после ручного перехода под Controller / Edit / 1 path я перенаправлен на страницу входа в систему. Ну, это неплохо, может быть, но я хочу показать 404 вместо него и попытаться придерживаться атрибутов для него. Это возможно?
2 ответов
это возможно?
конечно, вы можете написать пользовательский атрибут авторизации:
public class MyAuthorizeAttribute : AuthorizeAttribute
{
protected override void HandleUnauthorizedRequest(AuthorizationContext filterContext)
{
filterContext.Result = new ViewResult
{
ViewName = "~/Views/Shared/401.cshtml"
};
}
}
и затем использовать его:
[MyAuthorize(Roles = "Admin")]
public ActionResult Edit(int id)
Примечание: Вы, вероятно, хотите показать страницу 401 или 403, если пользователь не авторизован вместо 404, который для файла не найден.
в ответ на комментарий @ Daniel на мой комментарий к ответу @Darin это моя реализация:
[AttributeUsage(AttributeTargets.Method | AttributeTargets.Class, Inherited = true, AllowMultiple = true)]
public class CustomAuthorizeAttribute : AuthorizeAttribute
{
public override void OnAuthorization(AuthorizationContext filterContext)
{
string cookieName = FormsAuthentication.FormsCookieName;
if (!filterContext.HttpContext.User.Identity.IsAuthenticated ||
filterContext.HttpContext.Request.Cookies == null ||
filterContext.HttpContext.Request.Cookies[cookieName] == null
)
{
HandleUnauthorizedRequest(filterContext);
return;
}
var authCookie = filterContext.HttpContext.Request.Cookies[cookieName];
var authTicket = FormsAuthentication.Decrypt(authCookie.Value);
string[] roles = authTicket.UserData.Split(',');
var userIdentity = new GenericIdentity(authTicket.Name);
var userPrincipal = new GenericPrincipal(userIdentity, roles);
filterContext.HttpContext.User = userPrincipal;
base.OnAuthorization(filterContext);
}
// Redirects unauthorized users to a "401 Unauthorized" page
protected override void HandleUnauthorizedRequest(AuthorizationContext filterContext)
{
filterContext.Result = new ViewResult
{
ViewName = "~/Views/Shared/Error/401.cshtml"
};
}
}