Показать пользовательскую страницу ошибки вместо страницы входа
(Давать свои первые шаги на 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");
}
}