2011-11-14 14 views
5

Sto provando a configurare sessioni di scorrimento in WIF e devo gestire SessionSecurityTokenReceived.Come gestisco l'evento SessionSecurityTokenReceived in Global.asax?

Sono sicuro che sto facendo qualcosa di stupido qui ... ma VS2010 continua a dirmi che There is no applicable variable or member nel punto illustrato di seguito. Qualcuno può indicarmi la giusta direzione? Ho cercato in alto e in basso per esempi reali su come definire la gestione di questo evento, ma non riesco a trovarne uno singolo.

Global.asax

protected void Application_Start() 
{ 

    FederatedAuthentication.WSFederationAuthenticationModule.SecurityTokenReceived 
      += SessionAuthenticationModule_SessionSecurityTokenReceived; 
    //   ^^^ There is no applicable variable or member 
} 



void SessionAuthenticationModule_SessionSecurityTokenReceived(object sender, SessionSecurityTokenReceivedEventArgs e) 
{ 
      DateTime now = DateTime.UtcNow; 
      DateTime validFrom = e.SessionToken.ValidFrom; 
      DateTime validTo = e.SessionToken.ValidTo; 
      if ((now < validTo) && 
      (now > validFrom.AddMinutes((validTo.Minute - validFrom.Minute)/2)) 
      ) 
      { 
       SessionAuthenticationModule sam = sender as SessionAuthenticationModule; 
       e.SessionToken = sam.CreateSessionSecurityToken(
        e.SessionToken.ClaimsPrincipal, 
        e.SessionToken.Context, 
        now, 
        now.AddMinutes(2), 
        e.SessionToken.IsPersistent); 
       e.ReissueCookie = true; 
      } 
      else 
      { 
       //todo: WSFederationHelper.Instance.PassiveSignOutWhenExpired(e.SessionToken, this.Request.Url); 

       // this code from: http://stackoverflow.com/questions/5821351/how-to-set-sliding-expiration-in-my-mvc-app-that-uses-sts-wif-for-authenticati 

       var sessionAuthenticationModule = (SessionAuthenticationModule)sender; 

       sessionAuthenticationModule.DeleteSessionTokenCookie(); 

       e.Cancel = true; 
      } 
    } 

risposta

9

non credo che avete bisogno di sottoscrizione di eventi. Rimuovere l'abbonamento su start e basta usare

SessionAuthenticationModule_SessionSecurityTokenReceived

ASP.Net sarà filo che per voi. (Il modulo deve essere chiamato "SessionAuthenticationModule" ed è di default).

Se si sta lavorando su sessioni di scorrimento, questo post del blog di Vittorio è abbastanza buono: http://blogs.msdn.com/b/vbertocci/archive/2010/06/16/warning-sliding-sessions-are-closer-than-they-appear.aspx

+5

Facile e funziona come un fascino! Come faccio a distinguere tra gli eventi che necessitano di cablaggio e quelli che non lo sono – LamonteCristo

0

Invece di definire in Global.asax, creare una nuova classe che eredita SessionAuthenticationModule:

public class CustomAuthenticationModule : SessionAuthenticationModule 
{ 
    public CustomAuthenticationModule : base() 
    { 
     this.SessionSecurityTokenReceived += new EventHandler<SessionSecurityTokenReceivedEventArgs>(CustomAuthenticationModule_SessionSecurityTokenReceived); 
    } 

    void CustomAuthenticationModule_SessionSecurityTokenReceived(object sender, SessionSecurityTokenReceivedEventArgs e) 
    { 
     // Your code 
    } 
} 

Quindi, nel tuo web.config, sostituisci il modulo SessionAuthentication predefinito con il tuo nuovo modulo:

<modules> 
    <add name="SessionAuthenticationModule" type="CustomAuthenticationModule" preCondition="managedHandler"/> 
</modules> 
+0

Grazie, ho avuto qualche problema con alcune configurazioni ultimamente e questo mi ha salvato la giornata (non ho una pagina globale), anche se è non particolarmente in global.asax e dovrebbe essere forse in qualche altro thread, ma non sono riuscito a trovare questo pezzo di informazione elswhere. – Mochi