有没有办法在使用XmlHttpRequest时抑制浏览器在401响应上的登录提示

时间:2008-12-11 23:54:58

标签: jquery ajax internet-explorer firefox xmlhttprequest

我正在使用jQuert .ajax函数来调用页面方法。该网站正在使用FormsAuthentication。因此,当身份验证票证到期时,对页面方法的调用显然会导致重定向到登录页面。

现在,编写System.Web.Handlers.ScriptModule的天才决定,如果出于某种原因对页面方法或Web服务方法进行REST样式调用,则从JavaScript导致302重定向,它们将只是只需将响应转换为401 Unauthorized。这导致浏览器弹出一个完全误导的登录UI,因为用户试图输入他们的用户名和密码,这意味着什么,因为使用了FormsAuthentication。最后,当用户单击“取消”时,401将进入错误处理程序。

所以,问题是,如何以任何方式禁用浏览器的登录UI提示?网上有些人建议在XHR请求中使用用户名和密码,但它似乎不起作用。

3 个答案:

答案 0 :(得分:5)

我想我已经解决了这个问题。当然依赖于内部MS AJAX相关的错误并不是很好,但是这对于遇到这个问题的其他人来说也是可行的。

基本上你做的是,你将 X-MicrosoftAjax 标题设置为值 Delta = true (这里情况很重要),ScriptModule会将此解释为正常重定向,并将响应转换为 200 ,但会为要使用的页面上的任何ScriptManager(MS-AJAX PageRequestManager)设置 pageRedirect 数据字符串。 jQuery.ajax函数仍会将此视为错误,因此基本上您可以在XHR的responseText属性中检查 pageRedirect 并相应地对其进行处理。就像将用户发送到某个东西的登录页面一样。

    $.ajax({
            type: "POST",
            url: postUrl + "/SomePageMethod",
            data: "{searchString:\"" + escape(searchString) + "\"}",
            contentType: "application/json; charset=utf-8",
            beforeSend: function(xhr) {
                xhr.setRequestHeader("X-MicrosoftAjax","Delta=true");
            },
            dataType: "json",
            success: onSuccess,
            error: onError
        });

function onError(xhr, e, textStatus) {
    var isAjaxRedirect = xhr.status == 200 && xhr.responseText.match(/pageRedirect/);
    if (isAjaxRedirect == "pageRedirect") {
        // forms authentication ticket expired
        location.href = "a session timeout page, or a login page or whatever";
    }
}

答案 1 :(得分:2)

这可以在IIS中禁用。下面介绍的详细信息适用于IIS6,但要查找IIS7及更高版本的相关项目应该不难。

  1. 查找相关网站。
  2. 打开“目录安全性”选项卡或IIS版本中的相关选项卡
  3. 点击“身份验证和访问控制”部分中的“编辑”
  4. 取消勾选“集成Windows身份验证”
  5. 您不应再在浏览器中看到弹出窗口,并且能够根据需要发回正确的状态代码。

答案 2 :(得分:1)

两者都是很好的答案。但是,如果您的网站托管在共享服务器中,您可能无法更改IIS设置,因此客户端解决方案就会出现问题。 我一直面临同样的问题,这篇文章救了我。我的两分钱解决方案: 在jquery中(至少在最新版本中)你可以使用一个名为“header”的参数来发送这个头而不使用“beforeSend”回调,我认为这可以是一个更清洁的方式来做同样的事情。您还可以在此处添加其他标题信息:

$.ajax({
            type: "POST",
            url: postUrl + "/SomePageMethod",
            data: "{searchString:\"" + escape(searchString) + "\"}",
            contentType: "application/json; charset=utf-8",
        headers: { "cache-control": "no-cache", "X-MicrosoftAjax" : "Delta=true" },
            dataType: "json",
            success: onSuccess,
            error: onError
        });

我不知道这个标题“Delta = true”和after a bit research,它似乎是告诉服务器你正在做的请求是异步回发请求的标题。

AJAX调用将在“错误”回调中返回HTTP状态200(而不是"未授权" 401),这意味着服务器请求以某种方式成功(尽管身份验证失败)。有点奇怪,但它的工作方式。

希望这有帮助。