2012-04-05 6 views
6

Ho un servizio webhttp wcf che utilizza l'autenticazione basata su form per autenticare gli utenti. Funziona bene se il ticket arriva nella raccolta dei cookie o nell'URL.Estensione dell'autenticazione moduli per utilizzare un'intestazione http personalizzata per il ticket

Ma ora voglio inviare la stringa del ticket di autenticazione dei moduli in un'intestazione http personalizzata e modificare il modulo auth dei moduli per verificare l'intestazione anziché il cookie.

Penso che dovrebbe essere facile estendere i moduli auth per ottenere questo, ma non è stato possibile trovare alcuna risorsa su come. Puoi indicarmi la giusta direzione ?

ecco come il mio flusso di autenticazione avrebbe funzionato,

  1. Un client chiama il metodo autenticazione con il nome utente e pwd
  2. servizio restituisce la stringa ticket crittografato
  3. cliente trasmette la stringa biglietto ricevuto in un http intestazione con ogni richiesta successiva
  4. assegni di servizio per l'intestazione di autenticazione e convalida il biglietto auth
+0

avete provato decompilazione il modulo di autenticazione Forms? Dovresti essere in grado di creare una sottoclasse e sovrascrivere alcuni dei suoi metodi. O forse scrivi solo tu stesso. – cecilphillip

+0

Perché desideri inviare il ticket in un'intestazione personalizzata anziché in un'intestazione cookie standard? –

+0

Coz sembra più bello in uno scenario di API. L'invio di cookie non sembra naturale per un'API – Amila

risposta

3

Modulo Modulo di autenticazione non estendibile, ma è possibile scrivere la propria autenticazione. E 'molto semplice:

Authentication (2): chiamata


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 

servizio con il biglietto allegato (4):


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

In realtà ho fatto questo metodo e funziona bene ... – Amila

1

Non sono sicuro che questa sia la strada da seguire (eleganza), ma che dire dell'aggiunta di un evento in global.asax.cs per Application BeginRequest e prendere la stringa dall'intestazione e iniettare un cookie nella Richiesta (Forms l'autenticazione dovrebbe quindi ritirarla).

Qualcosa di simile:


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)); 
    } 
} 

NOTA BENE: Si prega di notare che non ho la prova questo, basta gettare un possibile approccio la tua strada!