2011-11-14 19 views
5

Estoy tratando de configurar sesiones deslizantes en WIF y necesito manejar SessionSecurityTokenReceived.¿Cómo manejo el evento SessionSecurityTokenReceived en Global.asax?

Estoy seguro de que estoy haciendo algo tonto aquí ... pero VS2010 sigue diciéndome que There is no applicable variable or member en el lugar ilustrado a continuación. ¿Alguien puede señalarme en la dirección correcta? He buscado alto y bajo muestras reales de cómo definir el manejo de este evento, pero no puedo encontrar uno solo.

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; 
      } 
    } 

Respuesta

9

no creo que necesita la suscripción de eventos. Retire la CUOTA de inicio y sólo tiene que utilizar

SessionAuthenticationModule_SessionSecurityTokenReceived

ASP.Net a cablear con eso para usted. (El módulo debe llamarse "SessionAuthenticationModule" y está configurado de forma predeterminada).

Si usted está trabajando en sesiones de deslizamiento, esta entrada del blog por Vittorio es bastante bueno: http://blogs.msdn.com/b/vbertocci/archive/2010/06/16/warning-sliding-sessions-are-closer-than-they-appear.aspx

+5

¡Fácil y funciona como un encanto! ¿Cómo puedo saber la diferencia entre los eventos que necesitan cableado y los que no – LamonteCristo

0

En lugar de definir en Global.asax, crear una nueva clase que hereda SessionAuthenticationModule:

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

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

Luego, en su web.config, sustituya el módulo predeterminado SessionAuthentication con su nuevo módulo:

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

Gracias, he estado luchando con algunas configuraciones últimamente y esto me salvó el día (no tengo una página global), aunque es no particularmente en global.asax y debería ser tal vez en otro hilo, pero no pude encontrar esta información en otro lugar. – Mochi

Cuestiones relacionadas