11

使用 ASP.NET MVC 5,我想为不同的场景返回适当的 HTTP 状态代码(401 表示用户未通过身份验证,403 表示用户无权访问某些资源等),而不是在 jQuery 中处理它们。

但问题是,当我尝试返回 401 时,它总是返回“302:找到”。自定义状态码的诀窍是什么,为什么这不起作用?

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()

4

1 回答 1

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;
        }
    }
}
于 2013-09-10T21:05:32.183 回答