4 Stimmen

warum wird getPasswordAuthentication() nicht aufgerufen?

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.Authenticator;
import java.net.MalformedURLException;
import java.net.PasswordAuthentication;
import java.net.URL;

import sun.net.www.protocol.http.AuthCacheImpl;
import sun.net.www.protocol.http.AuthCacheValue;

public class RunHttpSpnego {
  public static void main(String args[]) throws MalformedURLException,
      IOException {
    String urlString = "http://www.yahoo.com";
    String username = "XXXXXXXXX";
    String password = "XXXXXXXX";
     // This is modified after the question is being asked. Now this code works fine
     System.setProperty("http.proxyHost","176.x.xx.xx") ;
    System.setProperty("http.proxyPort", "8080") ;

    Authenticator.setDefault(new MyAuthenticator(username, password));

    URL url = new URL(urlString);
    InputStream content = (InputStream) url.getContent();
    BufferedReader in = new BufferedReader(new InputStreamReader(content));
    String line;
    while ((line = in.readLine()) != null) {
      System.out.println(line);
    }
    System.out.println("Done.");
  }

  static class MyAuthenticator extends Authenticator {
    private String username, password;

    public MyAuthenticator(String user, String pass) {
      username = user;
      password = pass;
    }

    protected PasswordAuthentication getPasswordAuthentication() {
      System.out.println("Requesting Host  : " + getRequestingHost());
      System.out.println("Requesting Port  : " + getRequestingPort());
      System.out.println("Requesting Prompt : " + getRequestingPrompt());
      System.out.println("Requesting Protocol: "
          + getRequestingProtocol());
      System.out.println("Requesting Scheme : " + getRequestingScheme());
      System.out.println("Requesting Site  : " + getRequestingSite());
      return new PasswordAuthentication(username, password.toCharArray());
    }
  }
}

-- Was muss ich jetzt überprüfen, wird getPasswordAuthentication überhaupt nicht aufgerufen? Ich bin sicher, mein IE ist Authentifizierung aktiviert, aber nicht sicher, welche Art von Authentifizierung war es.

5voto

BalusC Punkte 1034465

Les Authenticator wird nur für Websites verwendet, die grundlegende HTTP-Authentifizierung (Websites, auf denen Sie das bekannte Anmelde-/Passwort-Popup im Javascript-Stil sehen), nicht aber Websites, die formularbasierte Authentifizierung (eine HTML-basierte <form> mit Login- und Passwort-Feldern in einem meist auffälligen Markup/Stil) und auch nicht als dialup-ähnliches Login für Ihren ISP. Bei ersterem müssen Sie das Login als Querystring übergeben, bei letzterem müssen Sie den ISP vorher manuell verbinden oder einen Proxy erstellen/verwenden.

2voto

Boris R. Punkte 361

Sun.net.www.protocol.http.ntlm.NTLMAuthentication versucht, eine transparente Authentifizierung zu verwenden, d.h. die aktuellen Anmeldedaten des Benutzers werden für die Anmeldung am Remote-Server verwendet. In meinem Server-zu-Server-Szenario (Java EE-Server zu Sharepoint) war dies nicht akzeptabel. Um die transparente Authentifizierung zu deaktivieren, müssen wir den Authentifizierungsanbieter wissen lassen, dass die Verbindung nicht vertrauenswürdig ist und er sich bei jedem Aufruf authentifizieren muss:

static {
    NTLMAuthenticationCallback.setNTLMAuthenticationCallback(new NTLMAuthenticationCallback()
    {
        @Override
        public boolean isTrustedSite(URL url)
        {
            return false;
        }
    });
}

1voto

stevelo Punkte 114

Es könnte auch sein, dass die Serverseite eine präventive Authentifizierung verlangt und direkt eine 405-Fehlerantwort zurückgibt.

Die standardmäßige http-Basisauthentifizierung ist wie folgt: 1. client sends a request without authentication info. 2. server sends back 401 3. client resend the request with authentication info. 4. server send 200

Für die präemptive Authentifizierung: 1. client sends a request without authentication info. 2. server sends back 405, because there is no authentication info daher wird getPasswordAuthentication() nicht aufgerufen.

Der Workaround für diese Situation ist, Benutzername:Passwort zu kodieren und in den "Authorization"-Kopf zu setzen. (z. B. Autorisierung: Basic sldsfkjdsfjosdfjosjsdfs)

0voto

2red13 Punkte 11037

Versuchen Sie stattdessen Folgendes

    DefaultHttpClient http = new DefaultHttpClient();
    final String username = "xxxx";
    final String password = "xxxx";
    UsernamePasswordCredentials c = new UsernamePasswordCredentials(username,password);
    BasicCredentialsProvider cP = new BasicCredentialsProvider(); 
    cP.setCredentials(AuthScope.ANY, c); 
    http.setCredentialsProvider(cP);

    HttpResponse res;

0voto

drifterxy Punkte 1

Ich konfrontiert dieses Problem in 12.1.1, die standardmäßig http-Handler verwenden nicht mit der java.net.Authenticator funktioniert, kann 2 Optionen, um mit diesem zu behandeln haben:

Option 1, Verwendung von http-Autorisierung über URL zur Vermeidung von java.net.Authenticator.

HttpURLConnection uc = null;
URL url = new URL(server_URL);
uc = (HttpURLConnection) url.openConnection();
String userPassword = myaccount + ":" + mypassword;
String encoding = new sun.misc.BASE64Encoder().encode(userPassword.getBytes());
uc.setRequestProperty("Authorization", "Basic " + encoding);

Option 2, Verwendung von java.net.Authenticator durch Konfiguration des http-Handlers

Authenticator.setDefault(new MyAuthenticator());

URL url = new URL(null, service_URL, new sun.net.www.protocol.http.Handler());
uc = (HttpURLConnection) url.openConnection();

andernfalls können Sie in der Lage, die Sonne http-Handler zu Weblogic 12c in beiden oder einer der Client oder Server zu konfigurieren, die ich vergessen habe, um es funktioniert, wie es auf andere Anwendungen in diesem Server ausgeführt riskieren kann, würde ich nicht hier vorschlagen.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X