Фильтр действия авторизации 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")]]