MVC4表单身份验证+ AJAX操作

时间:2013-11-04 21:26:06

标签: c# asp.net-mvc-4 forms-authentication

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

  • 操作中的代码未执行
  • 操作返回HTTP 200而不是401
  • 该操作以字符串
  • 的形式返回Login视图的HTML
  • 由于返回了200状态而不是401,控件最终以jqXHR.done()而不是jqXHR.fail()
  • 结束

这是预期的行为吗?我能做些什么来让动作返回401吗?或者我还应该做些什么来处理这个问题?

2 个答案:

答案 0 :(得分:5)

将代码放在Application_EndRequest()中对我来说不起作用。以下是我的案例:

    protected void Application_BeginRequest()
    {
        HttpRequestBase request = new HttpRequestWrapper(Context.Request);
        if (request.IsAjaxRequest())
        {
            Context.Response.SuppressFormsAuthenticationRedirect = true;
        }
    }

答案 1 :(得分:0)

是的,这是预期的行为。

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

  

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

您可以使用此属性或尝试this answer中的以下解决方法:

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

或者您可以查看此问题并回答:Forms authentication: disable redirect to the login page并选择适合您返回401的方法。