jquery - ajax 请求中出现未经授权的结果

标签 jquery asp.net-mvc asp.net-mvc-3 http-status-code-401 unauthorized

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

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

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

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

最佳答案

将 Application_EndRequest 处理程序添加到 global.asax.cs 中的代码中,将 AJAX 请求的任何 302 错误(重定向到登录页面)修改为 401(未经授权)错误。这将允许您简单地保留 Controller 操作不变并通过客户端处理重定向(如果用户当前没有登录,您实际上只能让用户再次登录)。

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 的博客 Prevent Forms Authentication Login Page Redirect When You Don’t Want It 中概述的一些技术。

关于jquery - ajax 请求中出现未经授权的结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9608929/

相关文章:

c# - EditorFor IEnumerable<T> 与 TemplateName

javascript - 我可以使用我的 jQuery AJAX post 方法数据键连接到我的 php 文件吗?

javascript - 屏幕调整大小时重置切换(多种样式)

asp.net-mvc - 我可以将匿名类型传递给我的 ASP.NET MVC View 吗?

Asp.Net MVC 身份验证 Cookie 冲突

c# - 将模型从一个 Controller 传递到 MVC3 中的另一个 Controller 不起作用

jquery - 创建仅在移动设备中的中型设备(平板电脑)bot 上显示的 Bootstrap 菜单汉堡包图标

javascript - 在 JavaScript 中比较数组中的对象 ID

c# - ASP.NET MVC 路由表中没有路由与提供的值匹配

c# - 使用 MVC3 和 EF4 CTP5w 进行 JSON 序列化的循环引用异常