В ASP.NET происходит ли событие в журнале проверки подлинности Windows при сбое? (Регистрация сведений об ошибке аутентификации Windows)
Я создаю приложение для интрасети.NET 4.0, ASP.NET MVC 3, которое работает на IIS 7.5 в интегрированном режиме. Проверка подлинности Windows используется для управления доступом к веб-сайту. Модуль проверки подлинности Windows включен, а все остальные модули проверки подлинности отключены.
В настоящее время, когда пользователь предоставляет неправильные учетные данные, модуль проверки подлинности Windows корректно отклоняет учетные данные и повторно отображает запрос на вход в систему. Это происходит 3 раза, после чего отображается стандартная страница неавторизованного доступа.NET 401. Это ожидаемо и желательно.
Моя цель: я хотел бы иметь возможность записывать подробности неудачной попытки аутентификации в свой собственный журнал событий. В частности, для захвата имени пользователя, которое использовалось в журнале при попытке. (Я согласен, что захват пароля вряд ли возможен по соображениям безопасности.)
Возможна ли моя цель?
Я уже собрал работающий модуль IHttpModule и добавил его в качестве обработчика событий в модуль WindowsAuthenticationModule, например так:
myWindowsAuthenticationModule.Authenticate += WindowsAuthentication_Authenticate;
Но мой код не вызывается в случае неудачной попытки входа в систему, возможно потому, что WindowsAuthenticationModule уже решил, что вход в систему не удалось, и поэтому нет смысла вызывать мой модуль. Мой модуль вызывается после успешной попытки входа в систему, и поэтому я уверен, что мой обработчик событий правильно настроен.
Насколько мне известно, WindowsAuthenticationModule не предоставляет событие, которое запускается при сбое аутентификации, поэтому этот параметр отсутствует.
Есть идеи? Или я лаю на дерево, у которого нет решения?
1 ответ
Я смотрел на ту же проблему, и похоже, что нет никаких событий для проверки подлинности Windows, даже это событие Authenticate является общим для форм и окон.
Но я нашел решение для этого!
http://www.codeproject.com/Articles/11202/Redirecting-to-custom-401-page-when-quot-Access-de
ОБНОВИТЬ
Из оригинальной статьи
protected void Application_EndRequest(Object sender, EventArgs e)
{
HttpContext context = HttpContext.Current;
if (context.Response.Status.Substring(0,3).Equals("401"))
{
if(User.Identity.IsAuthenticated)
{
// this means user is authenticated, but 401 still returned
// which means no access to page or whatever you are trying to access?
}
}
}
UPDATE2
Я также узнал, что это решение не работает во всех случаях. Я тестировал в разных средах, поэтому работал для меня, но не для других.
По умолчанию IIS даже не запускает этот фрагмент кода и просто возвращает свою собственную страницу с ошибками. Вам нужно указать IIS, чтобы приложение обрабатывало ошибки.
<httpErrors existingResponse="PassThrough">
</httpErrors>
Теперь, с учетом сказанного, IIS не будет возвращать больше пользовательских ошибок, и вам нужно будет обрабатывать их в приложении, т.е. не только 401, но 403, 405 и т. д.