Фильтр действия авторизации ASP.Net MVC

Я пытаюсь понять, как работает обработка ошибок при использовании Authorize [Authorize] Action Filter в MVC Preview 4.

У меня есть действие, которое выглядит так:

[Authorize(Roles = "DOMAIN\\NOTAUTHORISED_ROLE" )]
[HandleError]
public ActionResult NeedAuthorisation()
{
    throw new NotImplementedException();
}

Когда я посещаю URL-адрес: http://localhost:2197/testAuthorisation/NeedAuthorisation, я получаю пустую страницу в своем браузере. В Firebug я вижу, что был сделан запрос, и был возвращен статус ответа 401 - Unauthorised. Но я не перенаправляюсь или возвращен customError. Все работает так, как ожидалось, при использовании роли, на которую я авторизован.

Это проверка подлинности Windows. Я нахожусь в середине написания кода, чтобы опробовать проверку подлинности с помощью форм, чтобы узнать, есть ли у меня такая же проблема. Я установил <customerrors mode="On"/> и создал страницы ошибок, как в папке testAuthorisation, так и в общей папке.

Ответ 1

В итоге я нашел этот учебник MVC, который решил мою проблему:

Точно, что происходит, когда вы пытаетесь вызвать действие контроллера без соответствующих прав зависит от типа аутентификация включена. По умолчанию при использовании ASP.NET Development Сервер, вы просто получаете пустую страницу. Страница подается с помощью 401 Not Авторизованный статус ответа HTTP.

Ответ 2

Если у вас установлено значение CustomErrors значение Off или RemoteOnly, вы не будете перенаправлены на страницу, заданную HandleError (по умолчанию - Error.aspx). Установите его на "On", а затем посмотрите, что произойдет. Однако любые пользовательские страницы ошибок, которые вы укажете явно, будут иметь приоритет, поэтому вам необходимо удалить их и просто:

<customErrors mode="On" />

Ответ 3

Вам понадобится окно с ошибкой в ​​соответствующей папке просмотра, т.е. вам нужен файл Views/TestAuthorization/Error.aspx, чтобы что-нибудь появилось.

Вы также можете настроить это поведение тем, что вы хотите использовать, и к какому исключению вы хотите, чтобы он был запущен.

[HandleError(ExceptionType = typeof(SqlException), View = "DatabaseError")]]
[HandleError(ExceptionType = typeof(NullReferenceException), View = "LameErrorHandling")]]