2015-01-31 11 views
7

Come prova, ho creato una nuova applicazione Asp.Net MVC5 utilizzando la più recente modello in Visual Studio 2013. Ho aggiunto il seguente metodo per Global.asax.cs:In che modo Owin è in grado di impostare i cookie di autenticazione Asp.Net Identity dopo la fase Application_EndRequest?

protected void Application_PreSendRequestHeaders() 
    { 
     Response.AppendCookie(new HttpCookie("TotalNumberOfCookiesInApplication_EndRequestIs", Response.Cookies.Count + string.Empty)); 
    } 

Quando avvio l'applicazione e fare un post a/account/Accedi usando le credenziali di un utente registrato, i cookie che vengono restituiti al cliente sono:

enter image description here

Nota che il cookie personalizzato ho aggiunto dimostra che non ci sono i cookie impostati nella risposta al momento in cui viene chiamato Application_PreSendRequestHeaders(). Nonostante ciò, tutti i cookie di Auth arrivano al cliente. Ho capito che Application_PreSendRequestHeaders() è l'ultima fase in cui possiamo "collegarci" per modificare i cookie. Il middleware Owin è in grado di aggiungere in qualche modo dei cookie, oppure mi manchi qualcosa?

(Nel caso in cui siete interessati, la mia motivazione per tutto questo è: sto cercando di modificare il dominio dei cookie auth di essere ".abc.com", dove 'abc.com' è l'ultima due parti dell'host nell'URI della richiesta.Voglio fare questo per supportare l'autenticazione su più sottodomini.L'impostazione di CookieDomain nel contesto della configurazione globale di Owin (IAppBuilder) non è sufficiente perché l'host della richiesta cambia tra il nostro debug/ambienti di staging/produzione e spesso distribuiamo il codice di produzione in fase di staging di Azure prima di eseguire il test prima di eseguire uno scambio VIP).

(noti anche che io sono a conoscenza di tutti i messaggi come this one, però non spiega dove i biscotti sono in realtà set)

EDIT:

Sulla base di un po 'più di ricerca, sembra che sto esaminando la conduttura sbagliata. Owin ha la sua pipeline, quindi ho trovato this post che descrive come possiamo collegarci. Viola ... c'erano i biscotti. Sarebbe bello se qualcuno potesse confermare che questo è davvero il modo più sensato per farlo.

EDIT 2:

Infine ha deciso di esaminare il codice sorgente di Katana e ha scoperto che tutto quello che dovevo fare per ottenere i miei domini biscotto set è stato il seguente codice nel mio CookieAuthenticationProvider

   OnResponseSignIn = context => 
       { 
        // Example only! 
        context.CookieOptions.Domain = context.Request.Uri.Host; 
       }, 
       OnResponseSignOut = context => 
       { 
        // Example only! 
        context.CookieOptions.Domain = context.Request.Uri.Host; 
       } 

Edit 3:

una soluzione ancora più pulito per il mio caso era solo quello di utilizzare un gestore di cookie personalizzato, che ha fissato il dominio del cookie in base alla richiesta corrente URI:

/// <summary> 
/// This class simply appends the cookie domain to the usual auth cookies 
/// </summary> 
public class ChunkingCookieManagerWithSubdomains : ICookieManager 
{ 
    private readonly ChunkingCookieManager _chunkingCookieManager; 

    public ChunkingCookieManagerWithSubdomains() 
    { 
     _chunkingCookieManager = new ChunkingCookieManager(); 
    } 

    public string GetRequestCookie(IOwinContext context, string key) 
    { 
     return _chunkingCookieManager.GetRequestCookie(context, key); 
    } 

    public void AppendResponseCookie(IOwinContext context, string key, string value, CookieOptions options) 
    { 
     // Simplification (use the context parameter to get the required request info) 
     options.Domain = ".domainBasedOnRequestInContext.com"; 
     _chunkingCookieManager.AppendResponseCookie(context, key, value, options); 
    } 

    public void DeleteCookie(IOwinContext context, string key, CookieOptions options) 
    { 
     // Simplification (use the context parameter to get the required request info) 
     options.Domain = ".domainBasedOnRequestInContext.com"; 
     _chunkingCookieManager.DeleteCookie(context, key, options); 
    } 
} 

... che viene poi impostato nelle opzioni di Auth Cookie nel setup Owin:

 app.UseCookieAuthentication(new CookieAuthenticationOptions 
     { 
      ... 
      CookieManager = new ChunkingCookieManagerWithSubdomains(), 
      ... 
      } 
     }); 

Speranza che aiuta qualcuno a venire attraverso lo stesso tipo di domanda.

+0

In realtà, c'è uno stadio più dove è possibile agganciare prima le intestazioni vengono inviati. HttpApplication.PreSendRequestHeaders. –

+0

Grazie Erik ... in questo caso non avrebbe aiutato il compito di modificare i cookie di autenticazione Owin, ma hai ragione nel ritenere che la mia affermazione fosse errata. Aggiornerò per chiunque altro lo trovi. – sammy34

+0

Sembra che quelle modifiche funzionerebbero bene come auto-risposte; se li sposassi a una risposta, farei l'uptote. –

risposta

4

Come richiesto da Tieson, ecco un riepilogo delle mie modifiche nel post originale sopra, come risposta.

Soluzione consigliata: utilizzare un cookie manager personalizzato.

/// <summary> 
/// This class simply appends the cookie domain to the usual auth cookies 
/// </summary> 
public class ChunkingCookieManagerWithSubdomains : ICookieManager 
{ 
    private readonly ChunkingCookieManager _chunkingCookieManager; 

    public ChunkingCookieManagerWithSubdomains() 
    { 
     _chunkingCookieManager = new ChunkingCookieManager(); 
    } 

    public string GetRequestCookie(IOwinContext context, string key) 
    { 
     return _chunkingCookieManager.GetRequestCookie(context, key); 
    } 

    public void AppendResponseCookie(IOwinContext context, string key, string value, CookieOptions options) 
    { 
     // Simplification (use the context parameter to get the required request info) 
     options.Domain = ".domainBasedOnRequestInContext.com"; 
     _chunkingCookieManager.AppendResponseCookie(context, key, value, options); 
    } 

    public void DeleteCookie(IOwinContext context, string key, CookieOptions options) 
    { 
     // Simplification (use the context parameter to get the required request info) 
     options.Domain = ".domainBasedOnRequestInContext.com"; 
     _chunkingCookieManager.DeleteCookie(context, key, options); 
    } 
} 

... che possono poi essere impostato nelle opzioni di Auth Cookie nel setup Owin:

app.UseCookieAuthentication(new CookieAuthenticationOptions 
     { 
      ... 
      CookieManager = new ChunkingCookieManagerWithSubdomains(), 
      ... 
      } 
     }); 
Problemi correlati