我正在使用jQuert .ajax函数来调用页面方法。该网站正在使用FormsAuthentication。因此,当身份验证票证到期时,对页面方法的调用显然会导致重定向到登录页面。
现在,编写System.Web.Handlers.ScriptModule的天才决定,如果出于某种原因对页面方法或Web服务方法进行REST样式调用,则从JavaScript导致302重定向,它们将只是只需将响应转换为401 Unauthorized。这导致浏览器弹出一个完全误导的登录UI,因为用户试图输入他们的用户名和密码,这意味着什么,因为使用了FormsAuthentication。最后,当用户单击“取消”时,401将进入错误处理程序。
所以,问题是,如何以任何方式禁用浏览器的登录UI提示?网上有些人建议在XHR请求中使用用户名和密码,但它似乎不起作用。
答案 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及更高版本的相关项目应该不难。
您不应再在浏览器中看到弹出窗口,并且能够根据需要发回正确的状态代码。
答案 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),这意味着服务器请求以某种方式成功(尽管身份验证失败)。有点奇怪,但它的工作方式。
希望这有帮助。