2013-04-12 9 views
7

Nella mia applicazione MVC, sto utilizzando l'autenticazione dei moduli per autenticare l'utente e quindi System.IdentityModel.Services.SessionAuthenticationModule per mantenere la sessione.MachineKeySessionSecurityTokenHandler e il token di sessione in scadenza tra i riavvii dell'applicazione

Mentre non sono ancora al punto in cui è necessario, volevo utilizzare System.IdentityModel.Services.Tokens.MachineKeySessionSecurityTokenHandler in modo che l'applicazione risiedesse correttamente in una Web farm (come descritto da Dominick Baier here).

Il problema che ho è che, data la gestione basata su machineKey, mi aspetto che la sessione non solo sia valida dal server alla macchina, ma dovrebbe anche sopravvivere al riavvio dell'applicazione. Tuttavia, ogni volta che riavvio o ricostruisco l'applicazione, dopo aver colpito l'applicazione nel browser, il cookie apparentemente non è più valido e viene rimandato alla schermata di autenticazione. Una volta autenticato di nuovo, tutto va bene e la sessione rimane. Tuttavia, la prossima volta che l'app si riavvia o viene ricostruita, sono costretto a eseguire nuovamente l'autenticazione.

Sono sicuro che questo è un aspetto di WIF che non sto ottenendo, ma non so da che parte andare. Non ho paura di dover estendere lo MachineKeySessionSecurityTokenHandler, ma mi piacerebbe essere sicuro di capire cosa sta succedendo qui prima di procedere. Comprendo che l'impostazione predefinita SessionSecurityTokenHandler utilizza DPAPI in combinazione con un identificatore del pool di app per la sua crittografia, quindi è logico che ciò accada in tal caso, ma il comportamento in MachineKeySessionSecurityTokenHandler mi imbarazza. C'è ancora qualche identificativo nell'applicazione che viene ricreato al riavvio dal quale dipende MachineKeySessionSecurityTokenHandler? Mi manca solo un'impostazione?

Qui ci sono le parti pertinenti dal mio web.config:

<configSections> 
    <section name="system.identityModel" 
      type="System.IdentityModel.Configuration.SystemIdentityModelSection, System.IdentityModel, Version=4.0.0.0, Culture=neutral, PublicKeyToken=B77A5C561934E089" /> 
</configSections> 

...

<system.identityModel> 
    <identityConfiguration> 
    <securityTokenHandlers> 
     <remove type="System.IdentityModel.Tokens.SessionSecurityTokenHandler, System.IdentityModel, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" /> 
     <add type="System.IdentityModel.Services.Tokens.MachineKeySessionSecurityTokenHandler, System.IdentityModel.Services, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" /> 
    </securityTokenHandlers> 
    </identityConfiguration> 
</system.identityModel> 

...

<system.web> 
    <machineKey compatibilityMode="Framework45" 
       validationKey="E27893..." 
       decryptionKey="ABC..." 
       validation="SHA1" decryption="AES" /> 
    <authentication mode="Forms"> 
    <forms loginUrl="~/Account/Login" 
     timeout="10080" /> 
    </authentication> 
</system.web> 

...

<system.webServer> 
    <modules runAllManagedModulesForAllRequests="true"> 
    <add name="SessionAuthenticationModule" 
     type="System.IdentityModel.Services.SessionAuthenticationModule, System.IdentityModel.Services, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" /> 
    </modules> 
</system.webServer> 
+1

Chris, volevo solo farvi una parola di ringraziamento. Stavo cercando di ottenere qualcosa del genere lavorando per quello che sto facendo ora, e il problema che avevo era ottenere i valori nel mio web.configs giusto. Quindi grazie per aver postato le impostazioni di web.config, b/c mi ha aiutato a risolvere questo problema. Mike –

+0

@indiecodemonkey - Sono felice che questo ti abbia aiutato! –

+0

Ho solo pensato che se si utilizza SessionAuthenticationModule per autenticare gli utenti senza utilizzare l'autenticazione dei moduli è necessario un ultimo passaggio per implementare la memorizzazione nella cache WIF condivisa (ad esempio, non reimposta sui ripristini del pool di applicazioni). E questo è un SessionSecurityTokenCache. Un esempio di uno sul MSDN è qui https://msdn.microsoft.com/en-us/library/hh545457(v=vs.110).aspx –

risposta

0

OK, questa è stata la mia stupida colpa. Per ragioni che non sono pertinenti qui, ho impostato il nome del cookie FedAuth a qualcosa di non standard (cioè non "FedAuth"), in questo modo:

FederatedAuthentication 
    .FederationConfiguration 
    .CookieHandler 
    .Name = "SomeThingNotStandard"; 

Il problema è stato che stava tramontando in questo modo solo al momento che ho emesso il token su un login di successo. Beh, ovviamente tutto andrà bene perché ora la configurazione in memoria sta cercando "SomeThingNotStandard" come nome del cookie. Tuttavia, al riavvio di un'app, la configurazione tornerà all'impostazione predefinita, cercando "FedAuth", non "SomeThingNotStandard". Questo costringe il re-login, che in caso di successo, riconfigura l'app e poi tutto sembra a posto.

Così ho messo il bit di codice sopra in Application_Start() e funziona bene attraverso ricostruzioni e riavvia.

Mossa stupida da parte mia.

Edit:

mi sono trasferito questo per la configurazione

<system.identityModel.services> 
    <federationConfiguration> 
    <cookieHandler 
     name="SomeThingNotStandard" /> 
    </federationConfiguration> 
</system.identityModel.services> 
+0

Non vedo come avresti potuto farlo funzionare. Il valore predefinito di WIF è una cache di token di sessione IN MEMORY, che entrerebbe in gioco con la configurazione specificata sopra. Apri SessionSecurityTokenCache in reflector e vedrai cosa intendo [http://code.msdn.microsoft.com/Claims-Aware-Web-Farm-088a7a4f] Se la cache è in memoria, perderà le sue biglie sul riciclo delle app. L'ho implementato utilizzando una SessionSecurityTokenCache personalizzata per sopravvivere ai ricicli. – nachonachoman

+1

@pete_w - Il problema che ho presentato riguarda specificamente il gestore di cookie, non la cache. In effetti, la cache dei token predefinita è in memoria e il riciclo di un'app essenzialmente la cancella. Come te, ho finito col rotolare la mia soluzione di caching personalizzata per risolvere questo problema. Tuttavia, questo problema era semplicemente dovuto al fatto che ho impostato un nome personalizzato per il token cookie in un brutto posto. Due problemi separati, davvero. –

2

hm - se si imposta la chiave della macchina in modo esplicito (come sembra che tu faccia) - Non vedo un motivo per cui ciò non funzionerebbe. Forse stai utilizzando altri cookie, sessioni ecc. Che attivano il problema di re-auth?

+0

Ugh, ho trovato il problema. Questo è stato semplicemente stupido da parte mia, a causa dell'impostazione del nome del cookie Fedauth su qualcosa di personalizzato, ma in un brutto posto. Pubblicherò la risposta qui sotto. –