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

Я пытаюсь понять, как работает обработка ошибок при использовании фильтра действий Authorize [Authorize] в 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, так и в папке Shared.

3 ответа

Решение

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

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

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

<customErrors mode="On" />

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

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

[HandleError(ExceptionType = typeof(SqlException), View = "DatabaseError")]]
[HandleError(ExceptionType = typeof(NullReferenceException), View = "LameErrorHandling")]]
Другие вопросы по тегам