2013-11-04 141 views
3

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

  • 行动中的代码没有得到执行
  • 操作返回一个HTTP 200,而不是401
  • 操作返回的HTML登录查看串
  • 因为200点的状态返回,而不是401,控制在jqXHR.done()代替jqXHR.fail()

这是预期的行为结束了?我能做些什么让行动回到401吗?还是有什么我应该做的来处理这件事?

回答

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的方法。

+0

感谢您的回答。从我检查的内容来看,字符串动作中的任何代码都不会被执行。那么我应该在哪里插入这行代码'HttpResponse.SuppressFormsAuthenticationRedirect = true'? – joym8

+0

在Application_EndRequest()中,如果将其添加到global.asax中,它将被自动调用。 –

+0

或者你可以ofcourse创建ActionFilterAttribute:http://www.asp.net/mvc/tutorials/older-versions/controllers-and-routing/understanding-action-filters-cs –

5

请辞Application_EndRequest()的代码,我没有工作。这是在我的情况是什么在起作用:

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

这是迄今为止最干净的解决方案。我用这个片段解决了我最初在ServiceStack.NET上指责的一个相同的问题。希望我在2小时前发现了这个! –