我想与需要身份验证的网站(在EXCEL VBA中)的REST API接口(interface),可以使用数字证书(.PFX文件)(NTLM身份验证),也可以使用Windows域身份验证(Kerberos和协商身份验证)。
后者是首选,但我也不知道该怎么做,我希望有人可以共享有关如何进行这两种身份验证的代码。我不能使用其他身份验证方法(例如基本身份验证),因为它不受支持。

目前,我正在使用VBA-Web(github:VBA-tools:VBA-Web),并且已经设法与api交互,但是使用的方式非常奇怪。我跟踪了从Chrome到网站的网络通话,并注意到它会将Cookie添加到每个通话的标题中。因此,在我的请求中,我添加:

webrequest.SetHeader "Cookie", "server.com.au=35558896564.55846.54545; SDASESSION=AQISFCwMasdffczd6afASFVHfgfgsdf%2BG35FsE%3D%40AAJTSwAJSDFSDTkMw%3D%3D%23; amlbcookie=07; JSESSIONID=000f:19pcqj2d1; server2.com.au=484566584.454584.41545"

但是,这显然很烦人,而且不方便用户使用-因为每次我要使用excel vba代码时都必须查找cookie。

此外,在Chrome浏览器中跟踪身份验证的网络调用之后,我注意到它经历了各种重定向,并在重定向时收集了所有cookie。在一个特定的调用期间,它将执行"negotiate"身份验证。

VBA-Web似乎基于WinHTTP,因此我四处张望,我真的迷失于如何与WinHTTP(或WinINet等)交互以进行这些身份验证。我已经看过setCredentials方法Link,但是我不确定NTLM或协商的用户名和密码是什么?

另外,我尝试改用数字证书,但是由于我有PFX文件,所以我不知道如何直接使用它。我看过Link,但是我不确定安装PFX后证书的存储位置。我在安装过程中选择了“个人”,这是否意味着它在LOCAL_MACHINE\Personal中?更重要的是,我不知道主题名称是什么。

Microsoft文档位于C++JScript中,因此也无济于事。

因此,如果我能够进行身份验证并获取cookie,那么其余的应该没问题。如何使用VBA在Excel中使用两种身份验证方法中的任何一种来做到这一点?

附言:我希望我的问题清楚。随时要求澄清。我找到的所有答案都恢复为基本身份验证,但我不能这样做。我会与您共享我要与之交互的网站,但该网站位于Intranet上。

最佳答案

您绝对可以使用WinHttp.WinHttpRequest从VBA进行NTLM身份验证-您必须添加Microsoft WinHTTP Services作为对VBA项目的引用。
它与使用powershell script完全相同,除了可能不存在凭证缓存。没问题,只需使用SetAutoLogonPolicy,SetCredentials或SetClientCertificate(CURRENT_USER或LOCAL_MACHINE是唯一有效的位置!)-请参阅this-例如SetClientCertificate("CURRENT_USER\Personal")

Dim auth As New WinHttp.WinHttpRequest

With auth
.Open "GET", "https://xxx.yyy", False
.setRequestHeader "Accept", "application/json" ' this is only an example, you probably don't need to set this header
.setRequestHeader <Whatever Header You Want>, <Header Value>
.SetAutoLogonPolicy(AutoLogonPolicy_Always) ' WARNING: Only use this if you trust the host you're trying to login to
.SetClientCertificate("CURRENT_USER\Personal") ' This will use the first certificate in the "CURRENT_USER\Personal" store, this might just work as is if you have a managed domain account.
.send
cookie = .getResponseHeader("Set-Cookie")
End With
有些主机似乎会重定向您,您必须在那儿进行身份验证,没问题,您只需手动(!!!)即可执行重定向。确保禁用自动重定向。
Dim auth As New WinHttp.WinHttpRequest

With auth
    .Open "GET", "https://xxx.yyy", False
    .setRequestHeader "Accept", "application/json" ' this is only an example, you probably don't need to set this header
    .setRequestHeader <Whatever Header You Want>, <Header Value>
    .SetAutoLogonPolicy(AutoLogonPolicy_Always) ' WARNING: Only use this if you trust the host you're trying to login to
    .SetClientCertificate("CURRENT_USER\Personal") ' This will use the first certificate in the "CURRENT_USER\Personal" store, this might just work as is if you have a managed domain account.
    .Option(WinHttpRequestOption_EnableRedirects) = False
    .send

    While .Status = "302" ' got redirected
        redirectLocation = .getResponseHeader("Location")
        ' Here you play the same game above until you get a proper session cookie
    Wend

End With
请注意,在每次重定向之后,您可能想要保存所获得的任何响应cookie,因为在大多数情况下,后续的http请求必须使用该cookie。
检查特定主机如何通过ntlm进行身份验证的最简单方法是仅在浏览器中使用开发人员工具并监视网络,您将看到所需的所有请求。
P.S.在大多数情况下,使用证书不会产生cookie,因此只需执行相同的步骤即可,如果您拥有有效的证书,则无需保存cookie。

关于Excel VBA : NTLM/Kerberos & Negotiate Authentication in VBA-Web/WinHttp,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/40455494/

10-09 06:49
查看更多