Показать страницу ошибки 404 после сбоя [Authorize] - PullRequest
6 голосов
/ 29 февраля 2012

У меня есть действие, которое я хочу ограничить только ролью «Администратор». Я сделал это так:

[Authorize(Roles = "Admin")]
public ActionResult Edit(int id)

После того, как я вручную перешел по пути Controller / Edit / 1, я перенаправлен на страницу входа Ну, это неплохо, но я хочу показать 404 вместо него и попытаться использовать атрибуты для него. Это возможно?

Ответы [ 2 ]

14 голосов
/ 29 февраля 2012

Возможно ли это?

Конечно, вы можете написать собственный атрибут авторизации:

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, что для файла не найден.

1 голос
/ 11 июля 2014

В ответ на комментарий @ 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"
        };
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...