3

在我的 ASP.NET MVC4 应用程序中,我使用表单身份验证。应用程序中的一个视图需要通过 jQuerypost()调用获取一些字符串数据。我写了一个返回字符串的动作。在表单身份验证票到期之前一切正常。过期后,对字符串操作的 AJAX 调用会产生以下结果:

  • 动作中的代码没有被执行
  • 该操作返回 HTTP 200 而不是 401
  • 该操作将登录视图的 HTML 作为字符串返回
  • 因为返回了 200 状态而不是 401,所以控件最终进入jqXHR.done()而不是jqXHR.fail()

这是预期的行为吗?我可以做些什么来使操作返回 401 吗?或者我应该做些什么来处理这个问题?

4

2 回答 2

5

将代码放入 Application_EndRequest() 对我不起作用。以下是我的情况:

    protected void Application_BeginRequest()
    {
        HttpRequestBase request = new HttpRequestWrapper(Context.Request);
        if (request.IsAjaxRequest())
        {
            Context.Response.SuppressFormsAuthenticationRedirect = true;
        }
    }
于 2013-11-12T15:53:00.260 回答
0

是的,这是预期的行为。

在 Asp.Net 4.5 中添加了HttpResponse.SuppressFormsAuthenticationRedirect 属性。但默认行为仍然是重定向到登录页面。来自 MSDN:

默认情况下,表单身份验证会将 HTTP 401 状态代码转换为 302,以便重定向到登录页面。这不适用于某些类型的错误,例如身份验证成功但授权失败,或者当前请求是 AJAX 或 Web 服务请求时。此属性提供了一种抑制重定向行为并将原始状态代码发送到客户端的方法。

您可以使用此属性或尝试从此答案中的以下解决方法:

protected void Application_EndRequest()
{
     if (Context.Response.StatusCode == 302 && Context.Request.Headers["X-Requested-With"] == "XMLHttpRequest")
    {
        Context.Response.Clear();
        Context.Response.StatusCode = 401;
    }
}

或者您可以看看这个问题和答案:表单身份验证:禁用重定向到登录页面并选择适合您的方法返回 401。

于 2013-11-04T21:31:45.473 回答