Excel VBA: NTLM / Kerberos & Negotiate Authentication in VBA-Web / WinHttp



我想与一个网站(在EXCEL VBA)的REST API接口,需要身份验证,使用数字证书(.PFX文件)(NTLM身份验证),或使用Windows域身份验证(Kerberos &;协商身份验证)。后者是首选,但我不知道如何做到这一点,我希望有人能分享如何进行这两种身份验证的代码。我不能使用其他身份验证方法(例如basic),因为它不受支持。

目前我正在使用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"

然而,这显然是恼人的和不友好的-因为我必须找到cookie每次我想使用我的excel vba代码。

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

VBA-Web似乎是基于WinHTTP,所以我环顾四周,我真的失去了如何与WinHTTP(或WinINet等)接口来做这些身份验证。我看过setCredentials方法链接,但我不确定NTLM或谈判的用户名和密码是什么?

或者,我尝试使用数字证书,但由于我有一个PFX文件,我不知道如何直接使用它。我看过链接,但我不完全确定安装PFX后我的证书存储在哪里。我选择个人在安装过程中,所以这是否意味着它在LOCAL_MACHINEPersonal ?更重要的是,我不知道主题是什么。

Microsoft文档要么在C++,要么在JScript,所以这对我也没有帮助。

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

p。我希望我的问题很清楚。请随意要求澄清。我找到的所有答案都回到了基本身份验证,但我不能这样做。我想和你们分享我正在尝试连接的网站,但它在内部网上。

您绝对可以使用WinHttp从VBA进行NTLM身份验证。WinHttpRequest——你必须添加Microsoft WinHTTP服务作为VBA项目的引用。

将与使用powershell脚本完全相同,只是可能凭据缓存不存在。没有问题,只需使用SetAutoLogonPolicy, SetCredentials或SetClientCertificate (CURRENT_USER或LOCAL_MACHINE是唯一有效的位置!)—参见此—例如SetClientCertificate("CURRENT_USERPersonal")

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_USERPersonal") ' This will use the first certificate in the "CURRENT_USERPersonal" 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_USERPersonal") ' This will use the first certificate in the "CURRENT_USERPersonal" 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进行身份验证,最简单的方法就是在浏览器中使用开发人员工具并监视网络,您将看到所需的所有请求。

注:在大多数情况下,使用证书不会生成cookie,所以只要遵循相同的过程,如果您有有效的证书,则不需要保存cookie。

最新更新