Портал Azure. Мвк. Перенаправление на пользовательскую страницу ошибки не работает для ошибки 403

Я настроил авторизацию role-based в своем приложении MVC. Затем мне нужно добавить пользовательскую обработку ошибки 403 http.

Я знаю два подхода к этому:

  1. Web.config настройки:

    <customErrors mode="Off" defaultRedirect="~/Error/" redirectMode="ResponseRedirect">
     <error statusCode="403" redirect="~/Error/NoAccess" />
    </customErrors>
    
  2. Конфигурация внутри переопределенного метода HandleUnauthorizedRequest в атрибуте Authorize:

    if (filterContext.HttpContext.User?.Identity.IsAuthenticated ?? false)
    {
       filterContext.Result = new RedirectToRouteResult(
       new RouteValueDictionary
       {
         {"action", "NoAccess"},
         {"controller", "Error"}
       });
       //I've tried two variants of below: with below line as well as without it 
       filterContext.Result.ExecuteResult(filterContext.Controller.ControllerContext);
    }
    

Оба этих метода хорошо работают на моем локальном компьютере, когда я пытаюсь получить доступ к ресурсам, которые не разрешены для моего пользователя, и я вижу свою пользовательскую страницу для ошибки 403, но когда я развертываю свое приложение на портале azure, я вижу только белую страницу со следующим текстом: 'У вас нет разрешения на просмотр этого каталога или страницы.'. Насколько я понимаю, мне нужно настроить это поведение на лазурном портале так же, как я настроил его в своем коде.

Может кто посоветует с ним?




Ответы (1)


Я нашел ответ. Проблема возникает в том случае, если я вручную устанавливаю код ответа в методе контроллера, как показано ниже:

public ActionResult NoAccess()
{
    Response.StatusCode = 403;
    return View();
}

В случае, если я удалю эту настройку статуса, перенаправление работает нормально. Решение состоит в том, чтобы установить в true следующий флаг: TrySkipIisCustomErrors

 public ActionResult NoAccess()
 {
     Response.TrySkipIisCustomErrors = true;
     Response.StatusCode = 403;

     return View();
 }

Тогда тоже все работает корректно.

person dododo    schedule 05.04.2018