【问题标题】:HttpStatusCodeResult(401) returns "302 Found"HttpStatusCodeResult(401) 返回“找到 302”
【发布时间】:2013-09-10 20:57:11
【问题描述】:

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

【问题讨论】:

  • 你在使用表单认证吗?
  • mrtig:我以前见过这个,但没有帮助,因为它说它是通过使用 IIS express 解决的。我用的是 IIS express,还是有问题。
  • Daniel A. White:我在 ASP.NET MVC5 模板中使用名为“个人用户帐户”的默认内置身份验证

标签: c# asp.net asp.net-mvc http-status-codes asp.net-mvc-5


【解决方案1】:

哈哈,这是一个很棒的问题

身份验证在 MVC 中的工作方式是,当您未登录并尝试访问安全页面时,它会引发 401 异常。然后 MVC 捕获此异常并将用户重定向到登录页面(即您看到的 302)

我想你可以做一些事情来解决它:

编辑

根据您的 cmets,以下代码将在通过 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;
        }
    }
}

【讨论】:

  • 重定向不会发生,因为控制器的方法是通过AJAX调用的,所以我需要302以外的东西,所以jQuery.get可以识别它。
  • @user2270404 看看 phil haacks 的代码。他创建了一个 HTTP 模块来解决这个问题并返回一个 401(对于 ajax 的情况)它有点乱,但它应该解决你的问题。根据文章,如果您使用 .NET 4.5 的东西,还有一种更好的方法来解决这个问题
  • 我查过文章,有点乱。我正在使用 .NET 4.5.1 并检查了 4.5 解决方案,但我还没有找到一种方法来从我的返回 ActionResult 的方法中操作 HttpResponse.SuppressFormsAuthenticationRedirect 属性。但是,我在 haack cmets 中发现了以下内容:它非常有用,只需添加一点:gist.github.com/1264267 如果您包含此代码 sn-p,我将很乐意接受您的回答。再次感谢您。
  • @user2270404 很高兴为您提供帮助:)
  • @user2270404 如果您的目标是.net 4.5,它只是Response.SuppressFormsAuthenticationRedirect = true
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-11-03
  • 1970-01-01
  • 2021-08-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-04-19
相关资源
最近更新 更多