使用ASP.NET MVC 5,我想为不同的场景返回适当的HTTP状态代码(401用户未经过身份验证,403当用户无权使用某些资源时等),而不是在jQuery中处理它们。
但问题是,当我尝试返回401时,它总是返回“302:Found”。自定义状态代码的技巧是什么,以及为什么这不起作用?
public ActionResult My()
{
if (User.Identity.IsAuthenticated == false)
{
return new HttpStatusCodeResult(401, "User is not authenticated.");
// Returns "302: Found"
}
// ... other code ...
}
编辑1:有趣的位:
如果我用这样的404替换401:
return new HttpNotFoundResult("User is not authenticated.");
然后它确实给出了404并且jQuery可以捕获问题。然而,由于错误代码不同,它不是一个优雅的解决方案。
编辑2: 302对我不利,因为结果会在jQuery.get().fail()
中使用,但302不会分流fail()
答案 0 :(得分:18)
大声笑这是一个很棒的问题
auth在MVC中的工作方式是,当您未登录并尝试访问安全页面时,它会抛出401异常。 MVC然后捕获此异常并将用户重定向到登录页面(这是您看到的302)
我想你可以采取一些措施来解决它:
修改强>
根据您的评论,以下代码会在通过ajax请求时将所有重定向转换为401。这是避免列出问题的一种方法
public class MvcApplication : HttpApplication {
protected void Application_EndRequest() {
var context = new HttpContextWrapper(Context);
// If we're an ajax request, and doing a 302, then we actually need to do a 401
if (Context.Response.StatusCode == 302 && context.Request.IsAjaxRequest()) {
Context.Response.Clear();
Context.Response.StatusCode = 401;
}
}
}