在我们的MVC网站上,我们使用Authorize
属性保护我们的端点,但是我希望在出现这种情况时将用户重定向到登录屏幕。我的第一个解决方案是对重定向Application_EndRequest
在Global.asax.cs
:如何在未授权的情况下重定向到我的登录屏幕,同时在MVC中返回401状态码?
protected void Application_EndRequest(object sender, EventArgs e)
{
if (Response.StatusCode == (int) HttpStatusCode.Unauthorized)
{
Response.ClearContent();
Response.Redirect("/Account/Login");
}
}
这样做的问题是,我们的一些观点是由AJAX加载,在这种情况下,我们不希望显示动态加载专区内的登录画面(这发生在例如退出后按下后退按钮时)。如果请求仍然返回登录屏幕,但使用401未授权状态代码,以便我们可以检测到此事件,会更好。显然这不适用于这种方法,因为重定向依赖于302状态码。
相反,我宁愿用401状态代码在Application_EndRequest
内插入登录屏幕内容。因此,代替Response.Redirect
的,我尝试这样做:
...
Response.ClearContent();
Server.TransferRequest("~/Account/Login");
Response.StatusCode = (int) HttpStatusCode.Unauthorized;
...
重定向工作得很好,但由于这种执行了新的要求,我不能设置状态代码以这种方式,我也得到了200元。不过对于检测未经授权的请求没有好处。
我也试过:
...
Response.ClearContent();
Server.Transfer("~/Account/Login");
Response.StatusCode = (int) HttpStatusCode.Unauthorized;
...
但我得到一个异常“为/帐号/登录错误执行子请求。”
我也试过:
...
Response.ClearContent();
HttpContext.Current.RewritePath("~/Account/Login");
Response.StatusCode = (int) HttpStatusCode.Unauthorized;
Response.End();
...
但这抛出一个异常 “线程已被中止”。我不确定如果Response.End()是必需的但没有它,我只是得到一个标准的IIS 401错误。
如何返回我的登录屏幕的内容,但带有401状态码?
尝试使用401自定义错误处理来返回登录视图。 –