javascript - 未经授权的 AJAX 请求返回状态代码 200 而不是 401

标签 javascript ajax asp.net-mvc authentication asp.net-mvc-5

在 MVC 5 中,我重写 HandleUnauthorizedRequest() 并检查请求是否来自 AJAX。

我还注册了一个全局ajaxComplete,用于处理401 AJAX请求,但是进入HandleUnauthorizedRequest()后状态码仍然是200。

问题:我是否必须在函数 HandleUnauthorizedRequest() 中手动更改 filterContext 中的状态代码?

检测到未经授权的 AJAX 请求

protected override void HandleUnauthorizedRequest(AuthorizationContext filterContext)
{
    if (filterContext.HttpContext.Request.IsAjaxRequest())
    {
        // <-- in here
        filterContext.Result = new JsonResult
        {
            Data = new
            {
                returnUrl = "foo"
            },
            JsonRequestBehavior = JsonRequestBehavior.AllowGet
        };
    }
    else
    {
        base.HandleUnauthorizedRequest(filterContext);
    }
}

全局ajax完成注册

$(document).ajaxComplete(function (e, xhr, settings) {
    console.log('xhr.status: "' + xhr.status +'"'); // 200 - i want 401
    if(xhr.status === 401) {
        window.location.replace(urlHelper.getUrlNotAuthorized());
    }
});

“在我找到 ajaxComplete 的解决方案之前,该解决方案可以工作,但已被破解。

它检查用户请求是否获得授权。缺点是每次发出请求时我都必须检查 isAuthorized() 。这就是为什么我想使用全局 ajaxComplete,这样我就不会错过任何一个。”:

检查用户 AJAX 请求是否已授权

isAuthorized = function (result) {
    try {
        var obj = JSON && JSON.parse(result) || $.parseJSON(result);
        // Here, obj can still be a parsed JsonResult, from when getting GetDatatableRows(), so we also need to check on returnUrl which is distinct
        // obj will only contain returnUrl if the JSON was returned from Shield validation
        if (obj && obj.returnUrl) {
            window.location.replace(urlHelper.getUrlNotAuthorized() + '?returnUrl=' + encodeURIComponent(obj.returnUrl));
            return false;
        }
    } catch (e) {
    }
    return true;
};

AJAX 请求,结果是部分 View 或 JSON

partialViewService.changePartialViewService(url, data)
.done(function (result) {
    if (isAuthorized(result)) {
        // use result
    }
});

最佳答案

是的 - 我还没有检查过这一点,但尝试添加指示的行。指定代码 401 不会过滤到您想要的结果。 (我怀疑这是由于身份拦截代码 401 造成的):

protected override void HandleUnauthorizedRequest(AuthorizationContext filterContext)
{
    if (filterContext.HttpContext.Request.IsAjaxRequest())
    {
        // Add this (code 401 does not work)
        filterContext.HttpContext.Response.StatusCode = 412;
        // <-- in here
        filterContext.Result = new JsonResult
        {
            Data = new
            {
                returnUrl = "foo"
            },
            JsonRequestBehavior = JsonRequestBehavior.AllowGet
        };
    }
    else
    {
        base.HandleUnauthorizedRequest(filterContext);
    }
}

关于javascript - 未经授权的 AJAX 请求返回状态代码 200 而不是 401,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35863217/

相关文章:

javascript - Django 中的 AJAX - 单击元素会更新与更新脚本相关的所有计数器。我怎样才能防止这种情况发生?

javascript - 如何使用 Valums Ajax File-Uploader 触发上传文件?

c# - 在来自不同列表的多个表上显示列标题

asp.net-mvc - ASP.NET MVC6中的 Entity Framework 7对同一个表的多个外键

javascript - 同一个表单中的两个提交按钮

javascript - 从目标 url 重定向的 YQL 查询

javascript - Node.js MYSQL解析错误

javascript - 使用 ajax 调用 WebMethod 时出现 500 Internal Server Error

javascript - 动态调用模态 Bootstrap 进行登录

c# - 如何在 mvc2 中的 html.label 帮助程序中设置 ID 和文本