在ASP.NET中是否有一个事件在Windows身份验证日志中失败? (记录Windows身份验证失败的详细信息)

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了在ASP.NET中是否有一个事件在Windows身份验证日志中失败? (记录Windows身份验证失败的详细信息)相关的知识,希望对你有一定的参考价值。

我正在构建一个.NET 4.0,ASP.NET MVC 3内部网应用程序,它在集成模式下运行在IIS 7.5上。 Windows身份验证用于管理对网站的访问。 Windows身份验证模块已启用,所有其他身份验证模块均已禁用。

目前,当用户提供不正确的凭据时,Windows身份验证模块会正确拒绝凭据并重新显示登录提示。它会这样做3次,之后会显示标准的.NET 401 Unauthorized Access页面。这是预期和可取的。

我的目标:我希望能够将失败的身份验证尝试的详细信息记录到我自己的自定义事件日志中。特别是,捕获尝试登录时使用的用户名。 (我会接受出于安全原因,很可能无法捕获密码。)

我的目标可能吗?

我已经构建了一个工作IHttpModule模块并将其作为事件处理程序添加到WindowsAuthenticationModule,如下所示:

myWindowsAuthenticationModule.Authenticate += WindowsAuthentication_Authenticate;

但是,在尝试登录失败的情况下,我的代码不会被调用,可能是因为WindowsAuthenticationModule已经确定登录失败,因此无法调用我的模块。成功登录尝试后,我的模块会被调用,因此我确信我的事件处理程序已正确设置。

据我所知,WindowsAuthenticationModule不会公开在身份验证失败时触发的事件,因此该选项已经用完。

有任何想法吗?还是我吠叫一棵没有解决方案的树?

答案

我正在查看相同的问题,看起来没有用于Windows身份验证的事件,即使Authenticate事件对于窗体和窗口也很常见。

但我找到了解决方案!

http://www.codeproject.com/Articles/11202/Redirecting-to-custom-401-page-when-quot-Access-de

UPDATE

来自原创文章

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让app处理错误。

<httpErrors existingResponse="PassThrough">
</httpErrors>

现在,有了这样说,IIS将不再返回任何自定义错误,您将需要在应用程序中处理它们,即。不仅是401,还有403,405等

以上是关于在ASP.NET中是否有一个事件在Windows身份验证日志中失败? (记录Windows身份验证失败的详细信息)的主要内容,如果未能解决你的问题,请参考以下文章

在 Windows 上通过 Visual Studio C# 和 ASP.NET 使用 Compass

asp.net中的页面卸载事件

是否有适用于 Windows 窗体的 Snoop (WPF) 或 FireBug (ASP.NET) 之类的东西? [关闭]

带有 Angular 6 的 Asp.Net Core 2.1 中的 Windows 身份验证 - Chrome 连续登录提示

如何在 Asp.net c# 中为 GridView 行启用双击和单击

ASP.NET:如何在订阅的事件处理程序中更新前端