В 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 и т. д.

Другие вопросы по тегам