2015-02-06 8 views
12

Abbiamo un'app ASP.NET MVC 5 che utilizza l'autenticazione del cookie Owin. Attualmente, abbiamo istituito cookie di autenticazione come segue:È possibile impostare un ExpireTimeSpan del cookie di sicurezza ASP.NET su base utente?

public partial class Startup 
{ 
    public void ConfigureAuth(IAppBuilder app) 
    { 
     var timeoutInMinutes = int.Parse(ConfigurationManager.AppSettings["cookie.timeout-minutes"]); 

     app.UseCookieAuthentication(new CookieAuthenticationOptions 
     { 
      AuthenticationType = DefaultAuthenticationTypes.ApplicationCookie, 
      AuthenticationMode = AuthenticationMode.Active, 
      LoginPath = new PathString("/"), 
      ExpireTimeSpan = TimeSpan.FromMinutes(timeoutInMinutes), 
      SlidingExpiration = true, 
      LogoutPath = new PathString("/Sessions/Logout") 
     }); 
    } 
} 

Abbiamo una richiesta di funzionalità per consentire agli amministratori della nostra applicazione per personalizzare timeout di sessione all'interno delle loro organizzazioni. Tuttavia, il codice di configurazione sopra riportato viene eseguito a livello dell'applicazione MVC e la nostra app è multi-tenant. Qualcuno sa come impostare ExpireTimeSpan della sessione di un utente per utente, sia durante l'autenticazione che sovrascrivendo un evento della pipeline Owin da qualche parte?

Grazie in anticipo!

risposta

11

Le opzioni di autenticazione contengono una proprietà denominata Provider. È possibile impostare questo al provider predefinito e utilizzare uno dei metodi di override, ad esempio OnResponseSignIn per modificare le impostazioni del login, oppure è possibile implementare il proprio ICookieAuthenticationProvider e fare lo stesso.

app.UseCookieAuthentication(new CookieAuthenticationOptions 
{ 
    Provider = new CookieAuthenticationProvider 
    { 
     OnResponseSignIn = signInContext => 
     { 
      var expireTimeSpan = TimeSpan.FromMinutes(15); 

      if (signInContext.Properties.Dictionary["organization"] == "org-1") 
      { 
       expireTimeSpan = TimeSpan.FromMinutes(45); 
      } 

      signInContext.Properties.ExpiresUtc = DateTime.UtcNow.Add(expireTimeSpan); 
     } 
    } 
}); 

Si potrebbe o controllare la pretesa in entrata per vedere come la sessione deve essere maneggiato o si potrebbe aggiungere dati personalizzati per il vostro segno in chiamata.

context.Authentication.SignIn(new AuthenticationProperties 
{ 
    Dictionary = 
    { 
     { "organization", "org-3" } 
    } 
}, new ClaimsIdentity()); 

Si potrebbe anche impostare ExpiresUtc sul segno nella chiamata se si voleva davvero, anche se potrebbe essere meglio lasciare che la logica nel provider di autenticazione in modo che sia più facile da gestire.

+0

Questo ha funzionato, grazie! –

+0

ExpiresUtc non sembra funzionare per me, anche se sembra promettente. –

+0

Sono un po 'sconcertato da come funziona; in particolare, questo approccio ha fornito una scadenza scorrevole, e non vedo come sia possibile. OnResponseSignIn viene richiamato una sola volta al momento dell'accesso e ExpiresUtc viene impostato su un orario specifico. Quindi se ho effettuato l'accesso alle 12:01, ExpiresUtc viene impostato su 12:16 ... ma se faccio una richiesta alle 12:05, sebbene un punto di interruzione in OnResponseSignIn non venga mai più colpito, il mio login non scade alle 12:16 ma rimane valido fino alle 12:20. Il mio cookie dovrebbe ancora dire 12:16 nonostante la richiesta successiva, quindi come è possibile? – Grank

Problemi correlati