Показать пользовательскую страницу ошибки вместо страницы входа

(Давать свои первые шаги на ASP.NET и MVC, так со мной)

В моем интернет-приложении MVC4 я использую AccountController, который поставляется по умолчанию вместе с ролями и т. Д.

Итак, у меня есть этот контроллер, в котором я определил роли для доступа к действиям, пример ниже.

public class SomeController : Controller
{
    private SomeDbContext db = new LookbookDbContext();

    //
    // GET: /Default1/
    [Authorize(Roles = "Administrator")]
    public ActionResult Index()
    {
        return View(db.SomeTable.ToList());
    }

...
}

Теперь я хотел, чтобы, когда пользователь / аноним пытался получить доступ к этому действию Index, вместо отображения формы входа в систему я использовал пользовательское представление ошибок.

Я добавил это, но это просто ничего не делает. Я продолжаю получать страницу формы входа. Я изменил его для тестирования porpuses, чтобы он выдавал мне страницу ошибки 401 по умолчанию, но она тоже не работает.

public class CustomAuthorize : AuthorizeAttribute
{
        protected override void HandleUnauthorizedRequest(AuthorizationContext filterContext)
        {
            filterContext.Result = new HttpUnauthorizedResult();
        }
}

Любая помощь приветствуется.

РЕДАКТИРОВАТЬ Хорошо, так что мне не хватало атрибута [CustomAuthorize] в моих действиях. Как только я добавил это к желаемому действию, это работало.

Спасибо!

2 ответа

ПРИМЕЧАНИЕ. Этот ответ был добавлен к вопросу. Я перемещаю его сюда, чтобы соответствовать правилам сайта.


Чего мне не хватало, так это атрибута [CustomAuthorize] в моих действиях. Как только я добавил это к желаемому действию, это сработало.

Очевидно, что первое, что вам нужно сделать, это создать свой собственный вид.

Теперь я бы порекомендовал сделать фильтр действий для этого:

[AttributeUsage(AttributeTargets.Class | AttributeTargets.Method, Inherited = true, AllowMultiple = true)]
public class AuthorizeAttribute : System.Web.Mvc.AuthorizeAttribute
{
    protected override void HandleUnauthorizedRequest(System.Web.Mvc.AuthorizationContext filterContext)
    {
        if (filterContext.HttpContext.Request.IsAuthenticated)
        {
            filterContext.Result = new System.Web.Mvc.HttpStatusCodeResult((int)System.Net.HttpStatusCode.Forbidden);
        }
        else
        {
            filterContext.RequestContext.HttpContext.Response.Redirect("~/shared/error");
        }
    }
}

Вы должны просто иметь возможность перенаправить на свой пользовательский вид ошибок из вашего атрибута.

пример

public class UnAuthorizedRedirectAttribute : AuthorizeAttribute
{
    protected override void HandleUnauthorizedRequest(AuthorizationContext filterContext)
    {
        filterContext.RequestContext.HttpContext.Response.Redirect("~/error/no-bacon");
    }
}
Другие вопросы по тегам