3

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

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

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

我的目标可能吗?

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

myWindowsAuthenticationModule.Authenticate += WindowsAuthentication_Authenticate;

但是如果登录尝试失败,我的代码不会被调用,大概是因为 WindowsAuthenticationModule 已经确定登录失败,所以调用我的模块没有意义。我的模块在尝试成功登录后被调用,因此我确信我的事件处理程序设置正确。

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

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

4

1 回答 1

3

我正在查看同样的问题,并且看起来没有用于 Windows 身份验证的事件,即使 Authenticate 事件对于表单和 Windows 来说也是常见的。

但我找到了解决方案!

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?
    }
 } 
}

更新2

我还发现此解决方案并非在所有情况下都有效。我在不同的环境中进行测试,所以为我工作,但不是为其他人工作。

默认情况下,IIS 甚至不会运行这段代码,只返回它自己的错误页面,你要做的是告诉 IIS 让应用程序处理错误。

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

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

于 2013-09-13T13:39:46.280 回答