2011-01-12 7 views
25

Ich würde gerne wissen, warum meine asp.net-Anwendung nicht die Kopfzeile zu meinem Beitrag hinzufügen, wenn es "Autorisierung" genannt wird, aber funktionieren, wenn ich ein Zeichen ändern, sagen "Autorisierungen". In der Dokumentation für andere Seiten verwenden sie immer den Namen "Authorization", also möchte ich das auch und an dieser Stelle möchte ich nur nachvollziehen warum.ASP.NET HTTP Authorization Header

Ich habe ein paar Themen zu diesem Thema gelesen, habe aber keinen logischen Grund dafür gefunden.

Hier ist mein Code unten:

string fileName = "c:\\xyz.xml"; 
string uri = "http://myserver/Default.aspx"; 
req = WebRequest.Create(uri); 
req.Method = "POST"; 
req.ContentType = "text/xml"; 
byte[] authBytes = Encoding.UTF8.GetBytes("DDSServices:jCole2011".ToCharArray()); 
req.Headers.Add("Authorization", "BASIC " + Convert.ToBase64String(authBytes)); 
req.Headers.Add("test", "test"); 
UTF8Encoding encoder = new UTF8Encoding(); 
byte[] data = encoder.GetBytes(this.GetTextFromXMLFile(fileName)); 
req.ContentLength = data.Length; 
Stream reqStream = req.GetRequestStream(); 
reqStream.Write(data, 0, data.Length); 
reqStream.Close(); 
req.Headers.Add("Authorization", "BASIC" + Convert.ToBase64String(authBytes)); 
System.Net.WebResponse response = req.GetResponse(); 
System.IO.StreamReader reader = new StreamReader(response.GetResponseStream()); 
string str = reader.ReadToEnd(); 

Das andere ärgerlich das ist, wenn ich die beobachtete Variable durch Fiedler hinzufügen funktioniert es gut.

Antwort

11

Für die HTTP-Basisautorisierung sollten Sie die Eigenschaft Credentials verwenden.

req.Credentials = new NetworkCredential("DDSServices", "jCole2011");

sollten dies tun, was Sie wollen. Anstatt den Autorisierungskopf zu setzen.

+0

oder gibt es eine logischer Grund? Eine sehr große Drittfirma, mit der wir arbeiten, hat eine Dokumentation mit ihrer Berechtigung auf die gleiche Weise, also würde ich gerne den Grund wissen. – Cody

+1

Es ist viel besser, den NetworkCredential-Ansatz zu verwenden, wie Will es vorschlägt. Allerdings sollte Ihr Ansatz auch gut funktionieren, obwohl ich nicht verstehe, warum Sie es zweimal tun (einen vor dem Aufruf von GetRquestStream und einmal danach. Sie sollten es einmal tun, bevor Sie GetRequestStream aufrufen. Wenn es immer noch nicht funktioniert, erhalten Sie ein trace log. Anweisungen unter http://ferozedaud.blogspot.com/2009/08/tracing-with-systemnet.html – feroze

+0

Können Sie mir sagen, warum es besser ist? Oder wo kann ich lesen, warum es besser ist? Anscheinend würde NetworkCredentials mit der Anzeigen- oder Formularauthentifizierung verbunden sein, ich würde lieber die Verbindung durch Anonymität herstellen und dann einfach verifizieren. Wie auch immer, kann mir jemand nur sagen, warum? Mir ist fast egal, was an diesem Punkt. – Cody

3

NetworkCredential ist eine gute Lösung, aber die Website, die Sie anrufen, muss eine unautorisierte mit einem 401 UND einem WWW-Authenticate-Header in der Antwort behandeln.

Auftraggeber:

request.Credentials = new CredentialCache {{aUri, "Basic", new NetworkCredential(aUserName, aPassword)}}; 

Server:

Response.ClearContent(); 
Response.StatusCode = 401; 
Response.AddHeader("WWW-Authenticate", "Basic"); 
Response.End(); 

Das in 2 Treffern zu dem Server führen. Der erste Anruf wird ohne Anmeldeinformationen an den Server gesendet. Wenn der Server mit einem 401 UND dem WWW-Authenticate-Header antwortet (mit dem erforderlichen Authentifizierungstyp), wird die Anfrage erneut mit den Anmeldeinformationen in der Anfrage gesendet.

+3

Das ist richtig, aber das Senden von 401 Unauthorized und der WWW-Authenticate-Header ist Teil der HTTP-Spezifikation. Wenn Sie das Senden der Kopfzeile bei der ersten Anforderung erzwingen möchten, können Sie dies über die PreAuthenticate-Methode tun. Darüber hinaus verarbeitet IIS diese Antwort automatisch, ebenso wie andere gut geschriebene HTTP-Server wie Apache. So wissen Browser, dass sie den Dialog zur Kennworteingabe anzeigen. –

41

Mir wurde eine Frage gestellt, wie man den Überschriften Authentication/Credentials hinzufügt. Ich habe die Lösung auf folgende Weise gefunden.

string _auth = string.Format("{0}:{1}", "myUser","myPwd"); 
string _enc = Convert.ToBase64String(Encoding.ASCII.GetBytes(_auth)); 
string _cred = string.Format("{0} {1}", "Basic", _enc); 
req.Headers[HttpRequestHeader.Authorization] = _cred; 

Was mich gab diese Header I (klebte Wireshark Beschreibungen) möchten,

Authorization: Grund bXlVc2VyOm15UHdk \ r \ n
Credentials: myUser: MyPwd

+0

Woher wissen Sie, dass die zu verwendende Kodierung ASCII ist? –

+1

Schöner Punkt. Die gewählte Kodierung sieht wie eine mögliche "schwer zu findende" Quelle für Bugs aus. Ich füge den Link http://stackoverflow.com/questions/7242316/what-encoding-should-i-use-for-http-basic-authentication für Leser hinzu, um mehr Informationen zu finden, wie man entscheidet. – Independent