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

时间:2016-07-13 19:06:47

标签: c# asp.net web-config global-asax

我有一个使用表单身份验证的站点,但登录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结束请求处理程序中的代码执行此操作:

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

有没有理由更喜欢这两种方法?

1 个答案:

答案 0 :(得分:2)

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