我正在使用jQuert .ajax函数来调用页面方法.该网站正在使用FormsAuthentication.因此,当身份验证票证到期时,对页面方法的调用显然会导致重定向到登录页面.
现在,编写System.Web.Handlers.ScriptModule的天才决定,如果出于某种原因对页面方法或Web服务方法进行REST样式调用,从JavaScript导致302重定向,他们只是简单地转向回应401未经授权.这导致浏览器弹出一个完全误导的登录UI,因为用户试图输入他们的用户名和密码,这意味着什么,因为使用了FormsAuthentication.最后,当用户单击"取消"时,401将进入错误处理程序.
那么,问题是,如何以任何方式禁用浏览器的登录UI提示?网上有些人建议在XHR请求中使用用户名和密码,但它似乎不起作用.
我想我是在解决它.当然依赖于内部MS AJAX相关的错误并不是很好,但这对于遇到这个问题的其他人来说也是有用的.
基本上你做的是,你将X-MicrosoftAjax标头设置为值Delta = true(这里的情况很重要),ScriptModule会将此解释为正常重定向,并将响应转换为200,但会设置pageRedirect数据要使用的页面上任何ScriptManager(MS-AJAX PageRequestManager)的字符串.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"; } }