2012-04-05 5 views
6

zu verwenden Ich habe einen Webtp-Dienst, der Formularauthentifizierung verwendet, um Benutzer zu authentifizieren. Dies funktioniert, wenn das Ticket in die Cookie-Sammlung oder in die URL kommt.Erweitern Sie Formularauthentifizierung, um eine benutzerdefinierte HTTP-Kopfzeile für Ticket

Aber jetzt möchte ich die Zeichenfolge des Forms Auth-Ticket in einem benutzerdefinierten HTTP-Header senden und ändern Sie die Formulare Auth-Modul, um für diesen Header anstelle des Cookies zu überprüfen.

Ich denke, es sollte einfach sein, Formulare zu erweitern, um dies zu erreichen, aber konnte keine Ressourcen finden, wie zu. Kannst du mich in die richtige Richtung weisen?

hier, wie mein Authentifizierungsablauf funktionieren würde,

  1. Ein Client ruft die authenticate Methode mit dem Benutzername und PWD
  2. Service gibt das verschlüsselte Ticket String
  3. Kunden das empfangene Ticket-String in einem http senden Header mit jeder weiteren Anfrage
  4. Service prüft auf Auth-Header und validiert das Auth-Ticket
+0

haben Sie versucht decompiling das Formularauthentifizierungsmodul? Sie sollten in der Lage sein, eine Unterklasse zu erstellen und einige seiner Methoden zu überschreiben. Oder schreiben Sie einfach Ihre eigenen komplett – cecilphillip

+0

Warum möchten Sie das Ticket in einem benutzerdefinierten Header anstelle eines Standard-Cookie-Header senden? –

+0

Coz sieht es in einem API-Szenario besser aus. Das Senden von Cookies sieht für eine API nicht natürlich aus – Amila

Antwort

3

Das FormAuthentication-Modul ist nicht erweiterbar, Sie könnten jedoch Ihre eigene Authentifizierung schreiben. Es ist sehr einfach:

Authentication (2):


var formsTicket = new FormsAuthenticationTicket(
    1, login, DateTime.Now, DateTime.Now.AddYears(1), persistent, String.Empty); 
var encryptedFormsTicket = FormsAuthentication.Encrypt(formsTicket); 
//return encryptedFormsTicket string to client 

Service-Anruf mit angeschlossenem Ticket (4):


var ticket = FormsAuthentication.Decrypt(encryptedFormsTicket) 
//extract authentication info from ticket: ticket.Name 
+0

Ich tat tatsächlich diese Methode und funktioniert gut ... – Amila

1

Ich bin nicht sicher, dass dies der Weg zu gehen ist (Eleganz-weise), aber was ist mit dem Hinzufügen eines Ereignisses in global.asax.cs für Application BeginRequest und die Zeichenfolge aus der Kopfzeile und ein Cookie in die Anfrage selbst (Forms Authentifizierung sollte das dann aufheben).

Etwas wie:


protected void Application_BeginRequest() 
{ 
    // Your code here to read request header into cookieText variable 
    string cookieText = ReadCookieFromHeader(); 

    var cookieData = FormsAuthentication.Decrypt(cookieText); 

    if (!cookieData.Expired) 
    { 
     HttpContext.Current.Request.Cookies.Add(new HttpCookie(cookieData.Name, cookieText)); 
    } 
} 

HAFTUNGSAUSSCHLUSS: Bitte beachten Sie, dass ich das nicht testen war, nur ein möglicher Ansatz den Weg zu werfen!