none
Обработка ошибки 403 Forbidden в ASP.NET MVC RRS feed

  • Вопрос

  • Добрый день!

    Я использую свой фильтр авторизации, унаследованный от AuthorizeAttribute, и в нем при авторизации делается деление на 401 (Не авторизован) и 403 (Доступ закрыт). Соответственно, унаследовал от ActionResult класс HttpForbiddenResult, который выдает в ответ код 403.

    Проблема в том, что я не могу настроить customErrors в web.config. Попробовал разные варианты: и с помощью контролера ErrorController с соответствующим действием, и прописыванием адреса к странице. Но в любом случае у меня появляется только белый экран. Режим Mode выставил в On.

    Что конкретно надо поставить в параметр redirect или что еще надо сделать, чтобы заработало?

    19 августа 2010 г. 3:35

Ответы

  • Белый экран появляется на веб-сервере cassini. На IIS должно работать.

     <customErrors mode="On" defaultRedirect="/Error">
          <error statusCode="401" redirect="/Error/Error401" />
          <error statusCode="403" redirect="/Error/Error403" />
          <error statusCode="404" redirect="/Error/Error404" />
        </customErrors>

    На IIS у меня все ошибки выводятся правильно, за исключением 401, вместо нее выходит дефолтная errorPage.

    Ошибки авторизации лучше обрабатывать в фильтре методов или в контроллере

    • Помечено в качестве ответа I.Vorontsov 25 августа 2010 г. 11:01
    21 августа 2010 г. 2:49

Все ответы

  • Белый экран появляется на веб-сервере cassini. На IIS должно работать.

     <customErrors mode="On" defaultRedirect="/Error">
          <error statusCode="401" redirect="/Error/Error401" />
          <error statusCode="403" redirect="/Error/Error403" />
          <error statusCode="404" redirect="/Error/Error404" />
        </customErrors>

    На IIS у меня все ошибки выводятся правильно, за исключением 401, вместо нее выходит дефолтная errorPage.

    Ошибки авторизации лучше обрабатывать в фильтре методов или в контроллере

    • Помечено в качестве ответа I.Vorontsov 25 августа 2010 г. 11:01
    21 августа 2010 г. 2:49
  • Белый экран появляется на веб-сервере cassini. На IIS должно работать.

     <customErrors mode="On" defaultRedirect="/Error">
          <error statusCode="401" redirect="/Error/Error401" />
          <error statusCode="403" redirect="/Error/Error403" />
          <error statusCode="404" redirect="/Error/Error404" />
        </customErrors>

    На IIS у меня все ошибки выводятся правильно, за исключением 401, вместо нее выходит дефолтная errorPage.

    Ошибки авторизации лучше обрабатывать в фильтре методов или в контроллере

    Столкнулся с аналогичной задачкой. Решение, по сути, то же самое (насколько об этом можно судить из исходного вопроса) - свой класс HttpAccessForbiddenResult, порожденный от ActionResult, в котором в ExecuteResult прописано:

                context.HttpContext.Response.StatusCode = 0x193;
                context.HttpContext.Response.StatusDescription = "403";
                context.HttpContext.Response.Write( "Доступ запрещен!" );

    В контроллере переписан OnAuthorization, где, при обнаружении ситуации, по бизнес-логике запрещенной правами, явно возвращается HttpAccessForbiddenResult:

                if ( null == currentUser || !currentUser.IsAdmin )
                    inFilterContext.Result = new HttpAccessForbiddenResult();

    Все это работает, но customErrors в web.config при этом никак не цепляются - всегда выдается простое сообщение "Доступ запрещен!". Убрать context.HttpContext.Response.Write( "Доступ запрещен!" ) тоже нельзя - браузер падает на разборе пустой страницы. Понятно, что раз браузер получает страницу с пустым контектом, то это не то, что задано в customErrors.

    Вопрос, собственно - вообще, из фильтров можно как-то вернуть такой Action/HttpResponse, чтобы это попало в обработку customErrors?

     

    Используемая конфигурация:
    - Widows 7, IIS 7;
    - ASP MVC 2;
    - режим pipeline mode app-пула сайта - classic;
    - в контроллере используются фильтры HandleError, OutputCache.


    Dmitry
    11 апреля 2011 г. 17:38