Excel VBA: аутентификация NTLM / Kerberos и согласования в VBA-Web / WinHttp

Я хочу взаимодействовать с REST API веб-сайта (в EXCEL VBA), который требует аутентификации, используя либо цифровой сертификат (файл.PFX) (аутентификация NTLM), либо используя аутентификацию домена Windows (Kerberos & Negotiate Authentication). Последнее предпочтительнее, но я не знаю, как это сделать, и я надеялся, что кто-нибудь может поделиться кодом о том, как выполнить любую из этих аутентификаций. Я не могу использовать другие методы аутентификации (например, базовые), потому что они не поддерживаются.

В настоящее время я использую VBA-Web (github:VBA-tools:VBA-Web), и мне удалось взаимодействовать с API, но очень странным образом. Я отслеживал сетевые звонки из Chrome на сайт и заметил, что он добавляет куки в заголовок каждого звонка. Поэтому в своих запросах я добавляю:

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, я заметил, что он проходит через различные перенаправления, собирая все куки по мере их перенаправления. Во время одного конкретного вызова он выполняет "согласованную" аутентификацию.

VBA-Web, кажется, основан на WinHTTP, поэтому я огляделся по сторонам, и я действительно был потерян в том, как взаимодействовать с WinHTTP (или WinINet и т. Д.), Чтобы выполнить эту аутентификацию. Я посмотрел на метод setCredentials ( https://msdn.microsoft.com/en-us/library/windows/desktop/aa384112(v=vs.85).aspx), но я не уверен, какое имя пользователя а пароль будет для NTLM или для переговоров?

В качестве альтернативы я попытался использовать вместо этого цифровой сертификат, но, поскольку у меня есть файл PFX, я понятия не имею, как использовать его напрямую. Я видел https://msdn.microsoft.com/en-us/library/windows/desktop/aa384055(v=vs.85).aspx но я не совсем уверен, где хранится мой сертификат после установки PFX, Я выбираю Личный во время установки, значит ли это, что он находится в LOCAL_MACHINE\ Личный? Что еще более важно, я не знаю, как называется предмет.

Документация Microsoft написана на C++ или JScript, так что это мне тоже не поможет.

Так что, если мне удастся пройти проверку подлинности и получить файлы cookie, остальное должно быть в порядке. Как бы я сделал это с любым из двух методов аутентификации в Excel, используя VBA?

PS Надеюсь, мой вопрос понятен. Не стесняйтесь просить разъяснений. Все ответы, которые я нашел, возвращаются к базовой аутентификации, но я не могу этого сделать. Я хотел бы поделиться с вами веб-сайтом, с которым я пытаюсь взаимодействовать, но он находится во внутренней сети.

0 ответов

Вы определенно можете выполнить аутентификацию NTLM из VBA с помощью WinHttp.WinHttpRequest - вам нужно добавить Microsoft WinHTTP Services в качестве ссылки на ваш проект VBA.

это будет точно так же, как при использовании сценария PowerShell, за исключением того, что, возможно, кеш учетных данных не существует. Нет проблем, просто используйте SetAutoLogonPolicy, SetCredentials или SetClientCertificate (CURRENT_USER или LOCAL_MACHINE - единственные допустимые местоположения!) - См. Это - например, 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, - это просто использовать инструменты разработчика в вашем браузере и контролировать сеть, вы увидите все запросы, которые вам нужны.

PS В большинстве случаев использование сертификата не создает cookie, поэтому просто следуйте той же процедуре, и вам не нужно сохранять cookie, если у вас есть действующий сертификат.

Можете ли вы проверить, работает ли этот для вас или нет?

Я не уверен насчет VBA, но запуск PowerShell из VBA кажется обходным решением без особых усилий.

Как использовать VBA или Powershell для экспорта списков с сервера Sharepoint с аутентификацией NTLM в Excel

Другие вопросы по тегам