【问题标题】:HttpClient 4.3.6 returning "WARNING: NEGOTIATE authentication error"HttpClient 4.3.6 返回“警告:协商身份验证错误”
【发布时间】:2014-12-03 16:53:41
【问题描述】:

我在 Java 6 中运行 HttpClient 4.3.6。当我运行以下代码时,身份验证似乎成功。返回的状态码是 200。但是,我在控制台中收到以下错误消息:

警告:NEGOTIATE 验证错误:提供的名称无效(机制级别:无法加载配置文件 C:\Windows\krb5.ini(系统找不到指定的文件))

如何消除此警告?

CloseableHttpClient httpclient = HttpClients.createDefault();
HttpContext localContext = new BasicHttpContext();
HttpGet method = new HttpGet(url);
CredentialsProvider credsProvider = new BasicCredentialsProvider();
credsProvider.setCredentials(
   new AuthScope(host, 80),
   new NTCredentials(userid, password, host, login_domain));

localContext.setAttribute(HttpClientContext.CREDS_PROVIDER, credsProvider);

String filePath = null;

// Execute the method.
CloseableHttpResponse clientResponse = httpclient.execute(method, localContext);

HttpEntity entity = clientResponse.getEntity();

int statusCode = clientResponse.getStatusLine().getStatusCode();

if (statusCode != HttpStatus.SC_OK) {
   System.err.println("Method failed: " + method.getRequestLine());
}

【问题讨论】:

    标签: java iis httpclient ntlm


    【解决方案1】:

    你需要传入一组目标首选认证方案:

    像这样创建你的 httpClient:

    PoolingHttpClientConnectionManager connPool = new PoolingHttpClientConnectionManager();
    
    connPool.setMaxTotal(200);
    connPool.setDefaultMaxPerRoute(200);
    
    // Authentication
    CredentialsProvider credsProvider = new BasicCredentialsProvider();
    credsProvider.setCredentials(AuthScope.ANY, new NTCredentials(username, password, workstation, domain));
    
    
    RequestConfig config = RequestConfig.custom().setTargetPreferredAuthSchemes(Arrays.asList(AuthSchemes.NTLM)).build();
    
    CloseableHttpClient httpClient = HttpClients.custom().setConnectionManager(connPool).setDefaultRequestConfig(config).build();
    
    HttpClientContext context = HttpClientContext.create();
    context.setCredentialsProvider(credsProvider);      
    

    【讨论】:

    • 感谢您的解决方案。我在哪里/如何设置 AuthScope 和 NTCredentials?
    • @MichaelSobczak 我刚刚注意到我的答案不正确,所以我编辑了这个答案。您不想删除提供程序,而是将 TargetPeferredAuthSchems 设置为 NTLM。
    【解决方案2】:

    是的,我相信,事实上,您的身份验证是成功的,并且可能只是从 Kerberos 退回到 NTLM。我的代码看起来与您的相似,在我的应用程序中,我使用 Java 7 中的 HttpClient 4.3.5 连接到 SharePoint。当 SharePoint 配置为“协商”(尝试 Kerberos,然后故障转移到 NTLM)时,我会看到类似的错误您在 HttpClient 生成的日志中报告的内容,具体而言:

    Selected authentication options: [NEGOTIATE, NTLM] Executing request GET /my/personal/user2/_api/web?$select=ServerRelativeUrl HTTP/1.1 Target auth state: CHALLENGED Generating response to an authentication challenge using Negotiate scheme init XXX.XXX.XXX.XXX:80 NEGOTIATE authentication error: org.ietf.jgss.GSSException, major code: 11, minor code: 0 major string: General failure, unspecified at GSSAPI level minor string: Desired initLifetime zero or less Generating response to an authentication challenge using ntlm scheme

    之后,它将通过 NTLM 成功进行身份验证。因此,我读到该错误消息说“Kerberos 不起作用,现在我们将使用 NTLM”。只要您收到 200 条响应,就可以开始了。

    【讨论】:

      【解决方案3】:

      您确定身份验证成功进行吗,如果网站设置为协商(尝试 Kerbero,然后故障转移到 NTLM)基本身份验证可能不会成功。

      【讨论】:

      • 我相信是的。当代码运行时,我可以从 IIS 服务器获取一个 Crystal Report。当身份验证失败时,我根本没有得到水晶报表。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-10-15
      • 1970-01-01
      • 1970-01-01
      • 2014-10-07
      • 1970-01-01
      • 2013-12-27
      • 1970-01-01
      相关资源
      最近更新 更多