Go在发出HTTP请求时是否有将DefaultNetworkCredentials与代理一起使用的方法



我正在编写一个简单的Go实用程序,它可以向internet发出一些POST请求,但我需要在不知道用户凭据的情况下通过代理并使用NTLM。我看到CSharp代码如下:

wc = new CookieWebClient();
wc.UseDefaultCredentials = true;
wc.Proxy = WebRequest.DefaultWebProxy;
wc.Proxy.Credentials = CredentialCache.DefaultNetworkCredentials;

在Go中,我成功地确定了系统代理,感觉像是黑客入侵:

import (
"net/http"
"net/url"
"strings"
"golang.org/x/sys/windows/registry"
)
func getSystemProxy() func(req *http.Request) (*url.URL, error) {
var e error
var k registry.Key
var proxy *url.URL
var v string
// Open the "Internet Settings" registry key
k, e = registry.OpenKey(
registry.CURRENT_USER,
strings.Join(
[]string{
"Software",
"Microsoft",
"Windows",
"CurrentVersion",
"Internet Settings",
},
"\",
),
registry.QUERY_VALUE,
)
if e != nil {
return http.ProxyFromEnvironment
}
defer k.Close()
// Read the "ProxyServer" value
v, _, e = k.GetStringValue("ProxyServer")
if (e != nil) || (v == "") {
return http.ProxyFromEnvironment
}
// Get the http= portion and fix it up
v = strings.Split(v, ";")[0]
v = strings.Replace(v, "=", "://", 1)
// Parse url
if proxy, e = url.Parse(v); e != nil {
return http.ProxyFromEnvironment
}
return http.ProxyURL(proxy)
}

我一直找不到一个相当于CSharp的Gohttps://learn.microsoft.com/en-us/dotnet/api/system.net.credentialcache.defaultnetworkcredentials?view=netcore-3.1.我发现https://github.com/Azure/go-ntlmssp但这需要我对用户的凭据进行硬编码,而我没有,我需要为每个用户编译一个新的二进制文件,我不想这样做。我正在寻找一个0配置解决方案。我希望这是尽可能动态的。如果CSharp能做到,为什么不能Go?

如有任何帮助,我们将不胜感激!

有人告诉我可以使用WinHTTP或WinInet来实现这一点。我将使用golang.org/x/sys/windows包并从DLL调用过程。或者,我被告知可以通过COM对象使用github.com/go-ole/go-ole和WinHTTP,就像在另一个SO问题中一样:Go HTTP NTLM请求中的Windows系统凭据。

更新:我最终决定选择WinInet,并创建了自己的包(gitlab.com/mjwhitta/win/WinInet(,其中包含一个http。可用于发出GET和POST请求的客户端。有关如何使用它的示例,请参阅自述文件。如果我有需要,我可能会在未来对其进行扩展。欢迎拉取请求。

上次更新:天哪,我觉得自己很笨。WinInet不想为你做NTLM。。。所以我把它移植到了WinHttp(gitlab.com/mjwhitta/win/WinHttp(

最新更新