2012-07-20 2 views
7

У меня есть приложение ASP.NET MVC3 с проверкой подлинности Windows, развернутое в IIS6. Когда пользователь, прошедший проверку подлинности, нажимает ссылку, которую они не имеют права на просмотр, им предлагается ввести свое имя пользователя и пароль (в диалоговом окне браузера, а не на странице), как и ожидалось.Получение пустой страницы вместо страницы ошибки 401

Однако после нажатия кнопки «Отмена» или ввода недопустимых учетных данных три раза, вместо того, чтобы видеть страницу несанкционированного доступа 401, я вижу пустую белую страницу.

Глядя на Fiddler, есть три запроса/ответов после нажатия Отмена. Вот резюме ответа и заголовки:

  1. ASP.NET Доступ запрещен сообщение (401,2)

    HTTP/1.1 401 Несанкционированное Дата: Пт, 20 июля 2012 14:34:21 GMT сервера : Microsoft-IIS/6.0 WWW-Authenticate: согласование WWW-Authenticate: NTLM X-Powered-By: ASP.NET X-Сеть САШ-версия: 4.0.30319 Cache-Control: частный Content-Type: текст/HTML; кодировка = UTF-8 Content-Length: 1701 Proxy-поддержка: Session-Based-Authentication

  2. IIS Вы не авторизованы для просмотра этой страницы (401,1)

    HTTP/1.1 401 Несанкционированное Контент- Длина: 1539 Content-Type: текст/html Сервер: Microsoft-IIS/6.0 WWW-Authenticate: NTLM TlRMTVNTUAACAAAADAAMADgAAAAF ... (для краткости опускаем) X-Powered-By: ASP.NET Дата: Пт, 20 Июль 2012 14:34:21 GMT Прокси-поддержка: аутентификация на основе сеанса

  3. Пустой ответ

    HTTP/1.1 401 Несанкционированное Дата: Пт, 20 июля 2012 14:34:21 GMT Сервер: Microsoft-IIS/6.0 WWW-Authenticate: согласование WWW-Authenticate: NTLM X-Powered-By: ASP.NET X-Сеть САШ-версия: 4.0.30319 X-AspNetMvc-Version: 3.0 Cache-Control: частный Content-Length: 0 Proxy-поддержка: Session-Based-Authentication

Как это сделать, чтобы отобразить страницу с ошибкой 401?

Update 1:

Вот моя ошибка web.config раздел.

<customErrors mode="RemoteOnly" defaultRedirect="~/Error" /> 

Я также использую HandleErrorAttribute.

Я подозреваю, что IIS возвращает пустую страницу, а не ASP.NET, но я не уверен, как это доказать.

Обновление 2:

Это интересно.Если я обновляю пустую страницу, я вижу сообщение об отказе ASP.NET Access.

+0

Просто догадаться, но пытается ли перенаправить их обратно на страницу имени пользователя и пароля, потому что они все еще не авторизованы? И поскольку он уже думает, что он обратился к пользователю, у представления нет ничего для отображения? –

+0

Это не страница входа в систему, ее диалоговое окно входа в браузер. – jrummell

+0

А жаль не видел эту часть. После третьей попытки вы перенаправляете их на страницу 401? Если нет, вы остаетесь на одной странице, но вы не получите никакого содержимого, потому что сервер не отправляет его. –

ответ

1

Я придумал эту работу после изучения перенаправления 401, как предложил @ AndrewHagner. Он основан на this answer. Я внедрил AuthorizeAttribute и overrode HandleUnauthorizedRequest().

protected override void HandleUnauthorizedRequest(AuthorizationContext filterContext) 
{ 
    if (!filterContext.HttpContext.User.Identity.IsAuthenticated) 
    { 
     var authenticatedUnauthorizedRouteValues = 
       new RouteValueDictionary(new {controller = "Error", action = "Index"}); 

     filterContext.Result = new RedirectToRouteResult(authenticatedUnauthorizedRouteValues); 
     filterContext.Controller.TempData["message"] = 
       "You are not authorized to view this page."; 
    } 
    else 
    { 
     base.HandleUnauthorizedRequest(filterContext); 
    } 
} 

Как я понимаю, это приведет к сбоям несанкционированных запросов в конвейере MVC перед отправкой в ​​IIS. Это дает мне возможность перенаправить на дружественную пользователю страницу без авторизации.

+0

Я все еще хотел бы знать, почему я получал пустую страницу без этого. – jrummell

+2

Просто сообщите вам строку 3 'if (filterContext.HttpContext.User.Identity.IsAuthenticated)' должно быть ', если (! FilterContext.HttpContext.User.Identity.IsAuthenticated)' – Azerothian

+0

Хорошая уловка! Я обновил код. – jrummell

0

вы должны попробовать установить в своем web.config введите правило, чтобы перенаправить пользователя на страницу Несанкционированного доступа таким образом.

<System.Web> 
    //map all the erros presented in the application to the error.aspx webpage 
    <customErrors mode="RemoteOnly" defaultRedirect ="~/error.aspx"> 
    //redirect the user to a Error401.pasx Page after the server get an 401 Error 
    <error statusCode="401" redirect="Error401.aspx" /> 
    </customErrors> 
<System.Web> 

Я надеюсь, что это сработает для вас.

+0

Это не имеет значения. (и '' должен быть дочерним элементом '') – jrummell

+0

ваш правый @jrummell, спасибо! –

Смежные вопросы