Excel VBA:NTLM / Kerberos&在VBA-Web / WinHttp中协商身份验证

时间:2016-11-06 22:55:01

标签: excel vba authentication ntlm http-negotiate

我希望使用数字证书(.PFX文件)(NTLM身份验证)或使用Windows域身份验证(Kerberos& Negotiate Authentication)与需要身份验证的网站(在EXCEL VBA中)的REST API进行交互)。 后者是首选,但我不知道如何做,我希望有人可以分享如何进行这些身份验证的代码。我不能使用其他身份验证方法(例如基本),因为它不受支持。

目前我正在使用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。在一个特定的呼叫期间,它进行“协商”认证。

VBA-Web似乎基于WinHTTP,所以我环顾四周,我真的迷失了如何与WinHTTP(或WinINet等)进行交互以进行这些身份验证。我查看了setCredentials方法(https://msdn.microsoft.com/en-us/library/windows/desktop/aa384112(v=vs.85).aspx),但我不确定NTLM或Negotiate的用户名和密码是什么?

或者,我尝试使用数字证书,但由于我有一个PFX文件,我不知道如何直接使用它。我见过https://msdn.microsoft.com/en-us/library/windows/desktop/aa384055(v=vs.85).aspx,但在安装PFX后,我并不完全确定我的证书存储在哪里。我在安装过程中选择了Personal,这是否意味着它在LOCAL_MACHINE \ Personal中?更重要的是,我不知道主题名是什么。

Microsoft文档使用的是C ++或JScript,因此对我也没有帮助。

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

P.S我希望我的问题很明确。随意要求澄清。我发现的所有答案都恢复为基本身份验证,但我不能这样做。我会与你分享我正在尝试与之交互的网站,但它在内联网上。

2 个答案:

答案 0 :(得分:1)

您绝对可以使用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。

答案 1 :(得分:0)

您能检查一下这是否适合您吗?

我不确定VBA,但是从VBA启动PowerShell似乎是一种解决方法,无需付出很多努力。

How to use VBA or Powershell to export lists from Sharepoint server with NTLM Authentication to Excel