web-dev-qa-db-de.com

Wie kann ich die Basisauthentifizierungsanmeldeinformationen aus dem Header abrufen?

Ich versuche, einige einfache Tests für den Authentifizierungsmechanismus zu schreiben, die die Basisauthentifizierung verwenden. Wie kann ich die Anmeldeinformationen aus dem Header abrufen?

string authorizationHeader = this.HttpContext.Request.Headers["Authorization"];

Wohin gehe ich von hier? Es gibt mehrere Tutorials, aber ich bin neu in .NET und der Authentifizierung. Könnten Sie in Ihrer Antwort genau erklären, was und warum Sie tun.

38
user4041873

Aus meinem Blog:

Dies wird im Detail erklären, wie das alles funktioniert:

Schritt 1 - Grundlegende Authentifizierung

Wenn Sie die Standardauthentifizierung verwenden, wird der HTTP-Anforderung ein Header hinzugefügt, der ungefähr wie folgt aussieht:

Berechtigung: Basic QWxhZGRpbjpvcGVuIHNlc2FtZQ ==

Quelle: http://en.wikipedia.org/wiki/Basic_access_authentication

"QWxhZGRpbjpvcGVuIHNlc2FtZQ ==" ist nur "Benutzername: Kennwort" in Base64 ( http://en.wikipedia.org/wiki/Base64 ). Um auf Header und andere HTTP-Eigenschaften in .NET (C #) zugreifen zu können, benötigen Sie Zugriff auf den aktuellen HTTP-Kontext:

HttpContext httpContext = HttpContext.Current;

Dies finden Sie im System.Web-Namespace.

Schritt 2 - Den Header abrufen

Der Berechtigungsheader ist nicht der einzige im HttpContext. Um auf den Header zuzugreifen, müssen wir ihn von der Anfrage erhalten.

string authHeader = this.httpContext.Request.Headers["Authorization"];

Wenn Sie Ihren Code debuggen, sehen Sie, dass der Inhalt dieses Headers dem folgenden ähnelt:

Grundlegendes QWxhZGRpbjpvcGVuIHNlc2FtZQ ==

Schritt 3 - Überprüfung der Kopfzeile

Sie haben den Header bereits extrahiert, jetzt gibt es mehrere Dinge, die Sie tun müssen:

  1. Stellen Sie sicher, dass der Header nicht null ist 
  2. Überprüfen Sie, ob der Autorisierungs-/Authentifizierungsmechanismus tatsächlich "Basic" ist.

So wie:

if (authHeader != null && authHeader.StartsWith("Basic")) {
    //Extract credentials
} else {
    //Handle what happens if that isn't the case
    throw new Exception("The authorization header is either empty or isn't Basic.");
}

Jetzt haben Sie überprüft, ob Sie Daten zum Extrahieren haben.

Schritt 4 - Anmeldeinformationen extrahieren

"Basic" -Substring entfernen

Sie können jetzt versuchen, die Werte für Benutzername und Kennwort abzurufen. Zuerst müssen Sie den Teilstring "Basic" entfernen. Sie können es so machen:

string encodedUsernamePassword = authHeader.Substring("Basic ".Length).Trim();

Weitere Informationen finden Sie unter den folgenden Links:

  1. http://msdn.Microsoft.com/de-de/library/system.string.substring(v=vs.110).aspx
  2. http://msdn.Microsoft.com/de-de/library/t97s7bs3(v=vs.110).aspx

Decodierung von Base64

Jetzt müssen wir von Base64 nach String decodieren:

//the coding should be iso or you could use ASCII and UTF-8 decoder
Encoding encoding = Encoding.GetEncoding("iso-8859-1");
string usernamePassword = encoding.GetString(Convert.FromBase64String(encodedUsernamePassword));

Jetzt werden Benutzername und Passwort in diesem Format angezeigt:

username:password

Benutzername teilen: Passwort

Um Benutzernamen und Passwort zu erhalten, können wir einfach den Index des ":" erhalten.

int seperatorIndex = usernamePassword.IndexOf(':');

username = usernamePassword.Substring(0, seperatorIndex);
password = usernamePassword.Substring(seperatorIndex + 1);

Jetzt können Sie diese Daten zum Testen verwenden. Viel Glück!

PS: Der endgültige Code kann so aussehen:

HttpContext httpContext = HttpContext.Current;

string authHeader = this.httpContext.Request.Headers["Authorization"];

if (authHeader != null && authHeader.StartsWith("Basic")) {
    string encodedUsernamePassword = authHeader.Substring("Basic ".Length).Trim();
    Encoding encoding = Encoding.GetEncoding("iso-8859-1");
    string usernamePassword = encoding.GetString(Convert.FromBase64String(encodedUsernamePassword));

    int seperatorIndex = usernamePassword.IndexOf(':');

    var username = usernamePassword.Substring(0, seperatorIndex);
    var password = usernamePassword.Substring(seperatorIndex + 1);
} else {
    //Handle what happens if that isn't the case
    throw new Exception("The authorization header is either empty or isn't Basic.");
}
155
Dawid O

Tolle Antwort von @DawidO.

Wenn Sie nur versuchen, die grundlegenden Auth-Creds zu extrahieren und sich auf die .NET-Magie verlassen, die Sie mit HttpContext erhalten, wird dies ebenfalls funktionieren:

  public static void StartListener() {
    using (var hl = new HttpListener()) {
      hl.Prefixes.Add("http://+:8008/");
      hl.AuthenticationSchemes = AuthenticationSchemes.Basic;
      hl.Start();
      Console.WriteLine("Listening...");
      while (true) {
        var hlc = hl.GetContext();

        var hlbi = (HttpListenerBasicIdentity)hlc.User.Identity;
        Console.WriteLine(hlbi.Name);
        Console.WriteLine(hlbi.Password);

        //TODO: validater user
        //TODO: take action
      }
    }
  }
3
sobelito

Denken Sie daran, dass die Verwendung von Strings weniger sicher sein kann. Sie bleiben im Speicher, bis sie von GC ausgewählt werden.

0
Anup Thakare