为了账号安全,请及时绑定邮箱和手机立即绑定

在发出 HTTP 请求时,Go 是否有某种方式使用 DefaultNetworkCredenti

在发出 HTTP 请求时,Go 是否有某种方式使用 DefaultNetworkCredenti

Go
潇潇雨雨 2022-07-11 15:09:45
我正在编写一个简单的 Go 实用程序,该实用程序向 Internet 发出一些 POST 请求,但我需要通过代理并在不知道用户凭据的情况下使用 NTLM。我见过如下 CSharp 代码:wc = new CookieWebClient();wc.UseDefaultCredentials = true;wc.Proxy = WebRequest.DefaultWebProxy;wc.Proxy.Credentials = CredentialCache.DefaultNetworkCredentials;在 Go 中,我设法确定了系统代理,感觉就像是 hack: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 的https://docs.microsoft.com/en-us/dotnet/api/system.net.credentialcache.defaultnetworkcredentials?view=netcore-3.1等效的 Go 。我找到了https://github.com/Azure/go-ntlmssp但这需要我对我没有的用户凭据进行硬编码,并且我需要为每个用户编译一个新的二进制文件,我会这样做不想做。我正在寻找 0 配置解决方案。我希望这尽可能动态。如果 CSharp 能做到,为什么 Go 不能呢?
查看完整描述

1 回答

?
宝慕林4294392

TA贡献2021条经验 获得超8个赞

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

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

最后更新:男孩,我觉得自己很愚蠢。WinInet 不希望为你做 NTLM ......所以我将它移植到 WinHttp (gitlab.com/mjwhitta/win/winhttp)。


查看完整回答
反对 回复 2022-07-11
  • 1 回答
  • 0 关注
  • 119 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信