VBA XMLHTTP 清除身份验证?

Posted

技术标签:

【中文标题】VBA XMLHTTP 清除身份验证?【英文标题】:VBA XMLHTTP clear authentication? 【发布时间】:2012-07-16 15:05:39 【问题描述】:

我正在编写一组 VBA 宏,其中它使用 XMLHTTP 对象向服务器发送异步请求。我正在发送基本身份验证:

XMLHttpReq.setRequestHeader "Authorization","Basic " & Base64EncodedUserPass

这第一次效果很好。 但是,如果用户更改了他们的用户名/密码,即使代码创建了一个全新的 XMLHttpReq 对象并将此标头设置为新信息,它也会以第一个用户身份登录服务器,可能是从缓存的凭据中登录的。

如何让代码“忘记”我之前登录过,重新授权?

编辑按要求,代码的相关部分;它真的不是很复杂:

myURL = "http://my.domain.com/myscript.cgi"
Dim oHttp As New MSXML2.XMLHTTP
oHttp.Open "POST", myURL, False
oHttp.setRequestHeader "Content-Type", "application/x-www-form-urlencoded'"
oHttp.setRequestHeader "Authorization","Basic " & Base64EncodedUsernamePassword
oHttp.send "PostArg1=PostArg1Value"
Result = oHttp.responseText

【问题讨论】:

如果我使用 URL 格式 http[s]://user:password@host/ 那么我可以互换使用不同的用户名,但这似乎不太安全。不过,也许这是唯一的方法? 您是否尝试过清除 IE 历史记录? mrexcel.com/forum/… 我不想仅仅为了这一项任务而清除整个 IE 历史记录。底层宏将作为更大产品的一部分分发给客户,我觉得我不应该直接控制他们的 IE 缓存。 好的。你能展示更多你的代码吗? 【参考方案1】:

由于主要浏览器对缓存方法的实现不同,这些问题已经以多种方式进行了讨论。

我会给你什么对我有用,然后是我在这个功能中找到的资源。

我能遇到的唯一解决方案是强制浏览器不缓存请求。

myURL = "http://my.domain.com/myscript.cgi"
Dim oHttp As New MSXML2.XMLHTTP
oHttp.Open "POST", myURL, False
oHttp.setRequestHeader "Content-Type", "application/x-www-form-urlencoded'"
oHttp.setRequestHeader("Cache-Control", "no-cache");
oHttp.setRequestHeader("Pragma", "no-cache");
oHttp.setRequestHeader("If-Modified-Since", "Sat, 1 Jan 2000 00:00:00 GMT");
oHttp.setRequestHeader "Authorization","Basic " & Base64EncodedUsernamePassword
oHttp.send "PostArg1=PostArg1Value"
Result = oHttp.responseText

似乎Cache-Control 适用于大多数浏览器,Pragma 仅适用于 Firefox 而不是 IE(不知道为什么...)

If-Modified-Since 用于 IE,因为 IE 在自己的算法中使用不同的设置来确定是否应该缓存请求。 XMLHttpRequest 似乎与 HTTP 响应不同。

小心:使用此代码,您将需要 usernamepassword 每次创建新对象。也许您应该创建一个新对象,将其实例化一次,然后在使用后将其销毁。在这两者之间,您将在不同的功能中处理您的所有请求,只需一次身份验证。


来源

MSDN setRequestHeader Method

MSDN IXMLHTTPRequest

XMLHTTPREQUEST CACHING TESTS

XMLHttpRequest and Caching

【讨论】:

在这种情况下我需要担心的唯一浏览器是 IE,因为我使用的是 MSXML2.XMLHTTP 对象(据我所知)只使用 IE 引擎。我会试试看。 第一次检查时,这满足了我的需要,但我可能需要进行更多调查。我还没准备好给这个“最佳答案”标志。 我仍在标记这个“最佳答案”,因为它部分有效。如果在 Authentication 标头中发送了错误的用户 ID 和密码,则会出现剩余的问题,这会导致 IE “用户名/密码”弹出窗口。如果我在此处手动输入正确的用户 ID 和密码,则在以后的调用中仍会忽略 Authentication 标头。有什么想法吗?

以上是关于VBA XMLHTTP 清除身份验证?的主要内容,如果未能解决你的问题,请参考以下文章

Javascript 清理缓存以清除基本身份验证凭据

通过 Windows 身份验证对话框清除用户名缓存

Spring Saml FilterChainProxy 清除上下文 - 空身份验证

xmlHttp.getResponseHeader + 不适用于 CORS

如何在 vba 中使用 Bcrypt.Net 对 PHP 中 crypt 函数存储的密码进行身份验证

Safari 5.1 基本身份验证注销问题