Атрибут MVC Authorize + HttpUnauthorizedResult + FormsAuthentication - PullRequest
7 голосов
/ 26 января 2010

После просмотра раздела MVC на CodePlex я заметил, что атрибут [Authorize] в MVC возвращает HttpUnauthorizedResult () при неудачной авторизации ( codeplex AuthorizeAttribute class ).

В источнике HttpUnauthorizedResult () из CodePlex находится код (мне не разрешено вводить другой URL, так как мой представитель недостаточно высок, но замените числа в приведенном выше URL на 22929 # 266476):

// 401 is the HTTP status code for unauthorized access - setting this
// will cause the active authentication module to execute its default
// unauthorized handler
context.HttpContext.Response.StatusCode = 401;

В частности, комментарий описывает неавторизованный обработчик модуля аутентификации по умолчанию.

Я не могу найти какую-либо информацию об этом неавторизованном обработчике по умолчанию. В частности, я не использую FormsAuthentication, и когда авторизация не проходит, я получаю некрасивую страницу ошибки IIS 401.

Кто-нибудь знает об этом неавторизованном обработчике по умолчанию и, в частности, как FormsAuthentication подключается, чтобы переопределить его?

Я пишу очень простое приложение для моей футбольной команды, которое подтверждает или опровергает, могут ли они сыграть конкретный матч. Если я включаю FormsAuthentication в web.config, перенаправление работает, но я не использую FormsAuthentication, и я хотел бы знать, есть ли обходной путь.

1 Ответ

11 голосов
/ 26 января 2010

Если у вас есть Reflector, взгляните на System.Web.Security.FormsAuthenticationModule.Init (). Этот метод перехватывает Application_EndRequest и вызывает OnLeave (). Метод OnLeave () проверяет, что код ответа - HTTP 401. Если это так, то модуль выполняет перенаправление, а не передает 401 клиенту. (Эта логика является тем, что в комментарии упоминается как «неавторизованный обработчик по умолчанию».) В вашем конкретном случае ASP.NET пропускает 401 пузыря до клиента, но IIS перехватывает его и отображает ужасную страницу с ошибкой.

Вы можете сделать что-то очень похожее из Global.asax. Сделай метод Application_EndRequest; этот метод будет вызываться в конце каждого запроса, обслуживаемого вашим приложением. Отсюда вы можете делать все, что захотите. Если вы хотите проверить, является ли ответ 401, и перенаправить его на другую страницу, вы можете сделать это здесь.

...