httpClient.SendAsync 抛出未指定的 GSS 失败

wal*_*ruz 2 httpclient docker .net-core

我正在使用 .NET Core 3.1 这是我正在使用的代码:

        CredentialCache credentialCache = new CredentialCache();
        credentialCache.Add(new Uri(URL), "NEGOTIATE", new NetworkCredential(USER, PASSWORD, DOMAIN));

        using (HttpClientHandler handler = new HttpClientHandler())
        {
            handler.Credentials = credentialCache;

            using (HttpClient httpClient = new HttpClient(handler))
            {
                HttpRequestMessage request = new HttpRequestMessage(new HttpMethod("GET"), REQUEST_URL);

                HttpResponseMessage response = httpClient.SendAsync(request).Result;

                Console.Write(response.ToString());
            }
        }
Run Code Online (Sandbox Code Playgroud)

它在我的 Windows 机器上工作正常,但在 Linux docker 容器上启动时崩溃:

System.AggregateException:发生一个或多个错误。(GSSAPI 操作失败,出现错误 - 未指定的 GSS 失败。次要代码可能会提供更多信息(找不到领域“DOMAIN_NAME”的 KDC)。) ---> System.ComponentModel.Win32Exception (0x80090020):GSSAPI 操作失败,出现错误 - 未指定的 GSS失败。次要代码可能会提供更多信息(无法找到领域“DOMAIN_NAME”的 KDC)。在System.Net.Security.NegotiateStreamPal.AcquireCredentialsHandle(字符串包,布尔isServer,NetworkCredential凭据)在System.Net.NTAuthentication.Initialize(布尔isServer,字符串包,NetworkCredential凭据,字符串spn,ContextFlagsPal requestContextFlags,ChannelBindingchannelBinding)在System。 Net.Http.AuthenticationHelper.SendWithNtAuthAsync(HttpRequestMessage请求,Uri authUri,ICredentials凭证,布尔isProxyAuth,HttpConnection连接,HttpConnectionPool连接池,CancellationToken取消令牌)在System.Net.Http.HttpConnectionPool.SendWithNtConnectionAuthAsync(HttpConnection连接,HttpRequestMessage请求,布尔doRequestAuth,CancellationToken cancelToken)在 System.Net.Http.HttpConnectionPool.SendWithRetryAsync(HttpRequestMessage 请求,布尔 doRequestAuth,CancellationToken CancellationToken) 在 System.Net.Http.AuthenticationHelper.SendWithAuthAsync(HttpRequestMessage 请求,Uri authUri,ICredentials 凭据,布尔 preAuthenticate,布尔 isProxyAuth,布尔 doRequestAuth 、 HttpConnectionPool 池、CancellationToken CancellationToken) 在 System.Net.Http.RedirectHandler.SendAsync(HttpRequestMessage 请求、CancellationToken CancellationToken) 在 System.Net.Http.DiagnosticsHandler.SendAsync(HttpRequestMessage 请求、CancellationToken CancellationToken) 在 OurHomeServer.Log.LoggingHandler.SendAsync( /src/OurHomeServer/Log/LoggingHandler.cs 中的 HttpRequestMessage 请求、CancellationToken CancellationToken):System.Net.Http.HttpClient.FinishSendAsyncBuffered 第 35 行(Task`1 sendTask、HttpRequestMessage 请求、CancellationTokenSource cts、Boolean disposeCts)

当我在容器的 shell 中使用curl 请求时它可以工作。

wal*_*ruz 5

我在我的 Dockerfile 中添加了以下行

RUN apt install -y mc sudo syslog-ng realmd gss-ntlmssp
Run Code Online (Sandbox Code Playgroud)

现在可以了!