Windows Go HTTP NTLM 请求中的系统凭据
Windows system credentials in Go HTTP NTLM requests
我正在寻找使用调用应用程序的 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 身份验证并手动提供 username/password,但这里的目标是避免将它们放入。
进一步研究后,看起来 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())
}
我正在寻找使用调用应用程序的 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 身份验证并手动提供 username/password,但这里的目标是避免将它们放入。
进一步研究后,看起来 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())
}