Аутентификация Apache HttpClient 4.1.1 NTLM не SPNEGO

Проблема здесь заключается в использовании веб-ресурса с аутентификацией NTLM при использовании Apache HttpClient на стороне клиента. Проблема, с которой я сталкиваюсь, заставляет клиента использовать аутентификацию NTLM. вот образец кода.

DefaultHttpClient httpclient = new DefaultHttpClient();
httpclient.getAuthSchemes().register("ntlm",new NTLMSchemeFactory());
NTCredentials creds = new NTCredentials("_myUSer_","_myPass_","_myWorkstation_","_myDomain_");
httpclient.getCredentialsProvider().setCredentials( new AuthScope("serverName",80), creds);
List<String> authpref = new ArrayList<String>();
authpref.add(AuthPolicy.NTLM);
httpclient.getParams().setParameter(AuthPNames.PROXY_AUTH_PREF, authpref);
HttpHost target = new HttpHost("serverName", 80, "http");
HttpGet httpget = new HttpGet("webResource");
HttpContext localContext = new BasicHttpContext();
HttpResponse response = httpclient.execute(target, httpget, localContext);

Вот ошибка из Java:

org.apache.http.client.protocol.RequestTargetAuthentication process
SEVERE: Authentication error: Invalid name provided (Mechanism level: Could not load configuration file C:\WINDOWS\krb5.ini (The system cannot find the file specified))

Ответ веб-сервера — 401.

Любые идеи о том, почему политика аутентификации не установлена ​​​​правильно? Я что-то упустил в коде?


person Kelly    schedule 21.04.2011    source источник
comment
Я обнаружил одну проблему с моим кодом, а именно то, что AuthScope должен указывать на ваш прокси, а не на вашу цель, что избавило от ошибок, когда он пытался использовать Kerberos вместо NTLM, но я все еще получаю 401 от сервер, какие-либо идеи о правильной комбинации имени пользователя/пароля/домена?   -  person Kelly    schedule 21.04.2011
comment
HttpClient необходимо обновить, проверьте мой пост [stackoverflow.com/questions/5917356/ [1]: stackoverflow.com/questions/5917356/   -  person Mohammed Irfan Tirupattur    schedule 19.11.2013


Ответы (4)


У меня аналогичная ситуация и я подозреваю, что вы задаете не тот параметр: AuthPNames.PROXY_AUTH_PREF. Я использую AuthPNames.TARGET_AUTH_PREF, и все работает нормально.

person evandongen    schedule 22.09.2011

Вот мое решение этой проблемы: И "эвандонген" прав.

Обратите внимание на использование URIBuilder.

String username = "uid";
String pwd = "pwd";
String servername = "www.someserver.com";
String workstation = "myworkstation";
String domain = "somedomain";
String relativeurl = "/util/myservice.asmx";

String oldimagePath = "\\mypath\\image.jpg";

DefaultHttpClient httpclient = new DefaultHttpClient();

try {
    httpclient.getAuthSchemes().register("ntlm",new NTLMSchemeFactory());
    NTCredentials creds = new NTCredentials(username,pwd,workstation,domain);

        httpclient.getCredentialsProvider().setCredentials(new AuthScope(servername,80), creds);

        List authpref = new ArrayList();

        authpref.add(AuthPolicy.NTLM);

        URIBuilder builder = new URIBuilder();
        builder.setScheme("http")
            .setHost(servername)
            .setPath(relativeurl + "/DeleteImage")
            .setParameter("imagePath", oldimagePath);
        URI uri = builder.build();

        httpclient.getParams().setParameter(AuthPNames.TARGET_AUTH_PREF, authpref);
        HttpHost target = new HttpHost(servicename, 80, "http");
        HttpGet httpget = new HttpGet(uri);

        HttpContext localContext = new BasicHttpContext();

        HttpResponse response1 = httpclient.execute(target, httpget, localContext);

        BufferedReader reader = new BufferedReader(new InputStreamReader(response1.getEntity().getContent())); 

        String line = reader.readLine(); 
        while (line != null) 
        { 
            System.out.println(line);
            line = reader.readLine(); 
        } 

} catch (Exception e) {
    System.out.println("Exception:"+e.toString());
} finally {
    // End
}
person Per Hoffmann Olsen    schedule 04.03.2013

Я думаю, что это из-за дефекта, см. здесь.

person Ian Beaumont    schedule 15.07.2011

HttpClient у меня не сработал, но сработал приведенный ниже фрагмент. Ссылка — http://docs.oracle.com/javase/7/docs/technotes/guides/net/http-auth.html

    public static String getResponse(String url, String userName, String password) throws IOException {
    Authenticator.setDefault(new Authenticator() {
      @Override
      public PasswordAuthentication getPasswordAuthentication() {
        System.out.println(getRequestingScheme() + " authentication");
        return new PasswordAuthentication(userName, password.toCharArray());
      }
    });

    URL urlRequest = new URL(url);
    HttpURLConnection conn = (HttpURLConnection) urlRequest.openConnection();
    conn.setDoOutput(true);
    conn.setDoInput(true);
    conn.setRequestMethod("GET");

    StringBuilder response = new StringBuilder();
    InputStream stream = conn.getInputStream();
    BufferedReader in = new BufferedReader(new InputStreamReader(stream));
    String str = "";
    while ((str = in.readLine()) != null) {
      response.append(str);
    }
    in.close();

    return response.toString();
  }
person Smitesh    schedule 25.03.2017