15

我有许多Ajax应用程序(使用JQuery.ajax实现),返回JSON或HTML。其中一些应该只能被授权用户访问,并且我用[Authorize]属性来装饰它们。对于非Ajax操作,如果用户未授权 - 系统将他重定向到登录页面(在web.config中配置)。未经授权的结果AJAX请求

但是这不适用于ajax动作,因为如果用户被授权 - 他加载页面,在该cookie过期并且他没有被授权之后,而不是html块,它应该替换旧的,他让我的登录页面进入块。

我知道我可以手动解决这个问题,例如删除[Authorize]属性,并返回特殊的json /空html,如果用户没有授权。但我不喜欢这个解决方案,因为我需要重写我所有的动作和ajax函数。我想要全局解决方案,允许我不要重写我的操作(可能是自定义授权属性,或者某些http未经授权的结果自定义处理)。

我想返回状态码,如果请求是ajax,并且重定向到登录页面,如果请求不是ajax。

+0

“我要回状态码,如果请求是阿贾克斯,并重定向到登录页面,如果要求不是阿贾克斯。” - 似乎你已经列出了这个问题的解决方案,不是吗? – 2012-03-07 21:00:00

+0

你现在想做什么?不管你采取什么路线,都会有一些重写。 – 2012-03-07 21:00:52

+0

有时我是个白痴。尝试使用Request.isAjaxRequest(); – Ohgodwhy 2012-03-07 21:01:22

回答

28

将application_endrequest处理程序添加到global.asax.cs中的代码中,该代码将任何302错误(重定向到登录页面)修改为针对AJAX请求的401(未授权)错误。这将允许您简单地将控制器操作保持原样并通过客户端处理重定向(如果用户当前不在,则只能让用户再次登录)。

protected void Application_EndRequest() 
{ 
    // Any AJAX request that ends in a redirect should get mapped to an unauthorized request 
    // since it should only happen when the request is not authorized and gets automatically 
    // redirected to the login page. 
    var context = new HttpContextWrapper(Context); 
    if (context.Response.StatusCode == 302 && context.Request.IsAjaxRequest()) 
    { 
     context.Response.Clear(); 
     Context.Response.StatusCode = 401; 
    } 
} 

然后在你的_Layout.cshtml文件添加一个重定向到您的登录操作时,它得到一个401响应全球AJAX错误处理程序。

<script type="text/javascript"> 
    $(function() { 
     $(document).ajaxError(function (e, xhr, settings) { 
      if (xhr.status == 401) { 
       location = '@Url.Action("login", "account")'; 
      } 
     }); 
    }); 
</script> 

你可能也想尝试一些在菲尔哈克的博客列出的技术,Prevent Forms Authentication Login Page Redirect When You Don’t Want It

+2

if(context.Response.StatusCode == 302 && context.Request。IsAjaxRequest()&& context.Response.RedirectLocation.StartsWith(“/ Account/Login”))我建议在条件中添加RedirectLocation,否则它可能会捕获一些其他重定向,并返回未经授权的......这将不被期望。 – cnom 2016-11-22 08:02:46

0

您可以检查Request.IsAjaxRequest()扩展方法,并采取具体行动,如果它是真实的前

其他人都做到了。

0

也许在你的AccountController(或任何你拥有它)您的登录行为可能会返回不同的结果,如果Request.IsAjaxRequest()是真正。

这意味着,如果一个AJAX调用授权的行动授权失败,你应该能够返回通过登录行动作出适当的反应..

例如

public ActionResult LogOn() 
{ 
    if (Request.IsAjaxRequest()) 
    { 
     // do appropriate response for ajax call here 
    } 

    return View(); 
} 

然后,你不应该需要做重大修改

相关问题