2016-08-08 8 views
2

Ich versuche mich bei einem Server anzumelden (REST-API), der die HTTP-Basisauthentifizierung verwendet. Die Anfrage sieht so aus:C# HTTP-Basisauthentifizierungsdaten werden zu früh gesendet

public JObject PerformLogin(string username, string password) 
{ 
    string html = string.Empty; 

    this.username = username; 
    this.password = password; 

    HttpWebRequest request = (HttpWebRequest)WebRequest.Create(auth_url_internal); 
    request.AllowAutoRedirect = true; 
    request.AutomaticDecompression = DecompressionMethods.GZip | DecompressionMethods.Deflate; 
    request.Method = "GET"; 
    request.CookieContainer = cookies; 
    request.KeepAlive = true; 
    //request.ServicePoint.Expect100Continue = false; 
    request.Accept = "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8"; 
    request.Headers.Add("Accept-Language", "de-DE,de;q=0.8,en-US;q=0.6,en;q=0.4"); 
    request.PreAuthenticate = true; 
    request.AuthenticationLevel = System.Net.Security.AuthenticationLevel.MutualAuthRequested; 

    string authInfo = username + ":" + password; 
    authInfo = Convert.ToBase64String(System.Text.Encoding.Default.GetBytes(authInfo)); 
    request.Headers.Add("Authorization", "Basic " + authInfo); 

    using (HttpWebResponse response = (HttpWebResponse)request.GetResponse()) 
    using (Stream stream = response.GetResponseStream()) 
    using (StreamReader reader = new StreamReader(stream)) 
    { 
     html = reader.ReadToEnd(); 
    } 

    JObject jresponse = JObject.Parse(html); 

    sess_url_internal = jresponse["internalUrl"].ToString(); 
    sess_url_public = jresponse["publicUrl"].ToString(); 

    return jresponse; 
} 

was grundsätzlich funktioniert, aber die Anmeldeinformationen werden zu früh gesendet.

Zuerst habe ich curl verwendet, um zu sehen, wie der Datenverkehr im Detail aussieht, und einen "Location:" - Header gefunden, was bedeutet, dass eine Weiterleitung stattfindet. Im Detail leitet der Server mich von , der Authentifizierungs-URL (lasst es URL1 nennen), zu /authenticationbasic/login?AlcApplicationUrl=/api/rest/authenticate%3fversion=1.0 (URL2) um.

Chrome sendet jedoch die Credentials an URL2, wo mein Programm sie an URL1 sendet, was zu früh ist, weil der Server sie an URL2 erwartet, wo meine Anwendung keine sendet und daher eine falsche Rückgabe erhält.

Wie kann ich dieses Verhalten ändern?

+0

dieses Set zu falsch 'request.AllowAutoRedirect = false;' und tun Sie Ihre eigenen Umleitung. –

+0

Wie kann ich meine eigene Weiterleitung durchführen? Warten Sie also im Grunde auf die Antwort, suchen Sie nach einem 'Location'-Header und, falls vorhanden, eine andere Antwort auf diesen Ort? –

+1

Yup ... du hast es ...: =) –

Antwort

1

Also mit der freundlichen Hilfe von x... habe ich herausgefunden, wie es geht:

Nach dem HttpWebResponse response = (HttpWebResponse)request.GetResponse(); einfach hinzufügen

if ((int)response.StatusCode == 302) // redirect 
{ 
    /* 
     Call the function recursively with the new URL, found in 
     response.Headers["Location"], in my case this would be: 
    */ 

    auth_url_internal = response.Headers["Location"]; 
    return PerformLogin(username, password); 
}