Go HTTP NTLM请求中的Windows系统凭据

时间:2017-03-15 17:20:46

标签: http go ntlm

我正在寻找使用调用该应用程序的Windows用户的系统凭据在Go HTTP请求中进行NTLM身份验证的阻力最小的路径。

在C#/ .NET中,我可以通过

实现这一目标
WebRequest request = WebRequest.Create(url);
request.Credentials = CredentialCache.DefaultCredentials;
WebResponse response = request.GetResponse();
Stream receiveStream = response.GetResponseStream();

在Python中,可以通过

获得等效结果
import win32com.client
h = win32com.client.Dispatch('WinHTTP.WinHTTPRequest.5.1')
h.SetAutoLogonPolicy(0)
h.Open('GET', url, False)
h.Send()

但我无法找到任何有关如何在Go中执行相同操作的资源。我当然可以使用一个库进行NTLM身份验证并手动提供用户名/密码,但这里的目标是避免将这些用户/密码放入。

1 个答案:

答案 0 :(得分:2)

在进一步深入研究之后,看起来go-ole可以像问题中的Python示例一样使用WinHTTPRequest。忽略所有错误捕获,

package main

import (
    "fmt"

    ole "github.com/go-ole/go-ole"
    "github.com/go-ole/go-ole/oleutil"
)

func main() {
    ole.CoInitialize(0)
    defer ole.CoUninitialize()
    unknown, _ := oleutil.CreateObject("WinHTTP.WinHTTPRequest.5.1")
    request, _ := unknown.QueryInterface(ole.IID_IDispatch)
    oleutil.CallMethod(request, "SetAutoLogonPolicy", 0)
    oleutil.CallMethod(request, "Open", "GET", "http://example.com", false)
    oleutil.CallMethod(request, "Send")
    resp := oleutil.MustGetProperty(request, "ResponseText")
    fmt.Println(resp.ToString())
}