对未经身份验证的用户和AJAX调用的不同响应

Kha*_*ash 2 ajax asp.net-mvc

我的ASP MVC(1.0)网站有一个默认的登录页面(基于OpenId - 但不应该有所不同).当AuthorizedAttribute在Action/Controller上时,它可以正常工作.

但是,我也有AJAX请求.以下是我对他们的看法:

if (Request.IsAjaxRequest())
{ 
  if (Request.IsAuthenticated)
  {
    // Authenticated Ajax request
  }
  else
  {
    // Non-authenticated Ajax request.
    Response.StatusCode = (int)HttpStatusCode.Unauthorized;
    return Json(new { response = "AUTHENTICATION_FAILED" });
   }
}
Run Code Online (Sandbox Code Playgroud)

问题是如果我将Response.StatusCode设置为Unauthorized,请求将被重定向到我的登录页面,这对Ajax请求不利.

对此问题的任何建议表示赞赏.

Cli*_*ity 5

这是一个常见问题.

Authorize属性返回Http 401 Unauthorized响应.然后返回一个HTTP 200(和登录页)回到您的Ajax请求 - 然而不幸的是,如果你启用了FormsAuthentication,401是由FormsAuthenticationModule然后执行重定向到登录页面拦截.

最好的替代方法是修改授权代码以返回不同的Http状态代码 - 比如403 - formAuthenticationModule没有捕获它,你可以捕获Ajax方法.