未经授权导致ajax请求

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

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

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

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


在global.asax.cs中的代码中添加一个Application_EndRequest处理程序,该程序将任何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文件中添加一个全局AJAX错误处理程序,该程序在获得401响应时重定向到您的登录操作。

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

您可能还想尝试一些Phil Haack的博客中描述的技术,防止表单身份验证登录页面重定向,当您不需要它时


您不必重写所有操作,只需创建一个自定义过滤器即可替换内置的Authorize过滤器。

其他人以前做过

asp.net mvc [handleerror] [授权]与JsonResult?


您可以检查Request.IsAjaxRequest()扩展方法,如果它为true,则执行特定操作。

链接地址: http://www.djcxy.com/p/71801.html

上一篇: Unauthorized result in ajax requests

下一篇: Determine if AJAX Request