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>
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 –
@indiecodemonkey - Sono felice che questo ti abbia aiutato! –
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 –