在 web.config 或 global.asax EndRequest 事件中重定向 401

本文关键字:事件 重定向 EndRequest asax web config global | 更新日期: 2023-09-27 17:56:45

我有一个使用表单身份验证的网站,但登录 URL 实际上是一个设置为使用 Windows 身份验证的页面("WinLogin.aspx")。 这样,如果用户在我们的网络上,WinLogin.aspx会捕获他们的域登录名,他们可以继续进入应用程序,而无需重新输入用户名和密码。 但是,如果他们没有登录到域,WinLogin.aspx会给出一个401错误,浏览器通常会通过要求用户输入用户名和密码来解释该错误以检查域服务器。

我想将这些 401 错误重定向到我自己的自定义页面,该页面获取该用户名和密码,以便我可以执行真正的表单身份验证,因为我的应用程序中的某些帐户没有相应的域帐户。

我可以像这样在 web.config 文件中重新路由 401 错误:

    <httpErrors errorMode="Custom">
        <error statusCode="401" path="/Redirect401.aspx" />
    </httpErrors>

或者,我可以使用 global.asax end 请求处理程序中的代码来做到这一点,如下所示:

void Application_EndRequest(object sender, System.EventArgs e)
{
    if (((Response.StatusCode == 401) && (Request.IsAuthenticated == true)))
    {
        Response.ClearContent();
        Response.Redirect("~/Redirect401.aspx");
    }
}

有什么理由更喜欢这两种方法吗?

在 web.config 或 global.asax EndRequest 事件中重定向 401

如果您的错误处理是干涸的,并且在重定向到错误页面之前您不想执行任何操作,则需要使用 web.config 方法。 在任何一种情况下,我都倾向于在 global.asax 中捕获错误,然后执行一些日志记录,然后重定向到错误页面,如果是 MVC 应用程序,则重定向到错误控制器。 在我的上一个应用程序中,我在 MVC 应用程序中使用了这种确切的方法,并让错误控制器操作在返回视图之前执行一些操作。 例如,在出现 401 错误的情况下,我让操作设置为 403 错误,因此它不会强制浏览器进入登录页面。 因此,这完全取决于您对一种方法的需求。