2011-04-28 4 views
4

Nous développons une application MVC en utilisant STS. Nous avons utilisé les outils WIF pour créer une application STS simple pour le développement.Comment faire pour définir l'expiration coulissante dans mon application MVC qui utilise STS (WIF) pour l'authentification

Je voudrais être en mesure de définir une expiration glissante dans mon jeton (dans le RP).

Je vois le code like here.

Malheureusement, ceci est le gestionnaire d'événements et l'exemple, bien qu'utile, ne montre pas comment implémenter le gestionnaire!

Dans mon global.asax, Application_Start() J'ai:

sam = new SessionAuthenticationModule(); 
     sam.SessionSecurityTokenReceived += 
      new EventHandler<SessionSecurityTokenReceivedEventArgs>(sam_SessionSecurityTokenReceived); 

(sam est défini avec une portée de classe.)

Je ne sais pas si cela est correct. Je ne sais pas comment vérifier si l'événement a déjà été appelé en raison de problèmes de débogage dans global.asax.

Existe-t-il un exemple plus complet de piège pour cet événement? Est-ce que je vais dans le bon sens?

TIA! J'apprécie l'aide! Editer - Eh bien, je sais que l'événement n'est pas appelé parce que j'ai mis le code par zéro dans le gestionnaire et l'application n'a pas levé d'exception. Je me suis connecté via mon STS, donc tout événement reçu par un jeton aurait dû être déclenché.

Toute aide sur la façon de le faire serait grandement apprécié. Merci!

Répondre

8

Depuis WIF ne permet que des sessions de longueur fixe, il faut réémission le jeton de sécurité à quel point vous pouvez définir lorsque la propriété IsValidTo du jeton de à tout ce que vous avez besoin.

Mettez dans votre fichier global.asax:

protected void SessionAuthenticationModule_SessionSecurityTokenReceived(object sender, SessionSecurityTokenReceivedEventArgs e) 
{ 
    var sessionToken = e.SessionToken; 
    SymmetricSecurityKey symmetricSecurityKey = null; 

    if (sessionToken.SecurityKeys != null) 
     symmetricSecurityKey = sessionToken.SecurityKeys.OfType<SymmetricSecurityKey>().FirstOrDefault(); 

    Condition.Requires(symmetricSecurityKey, "symmetricSecurityKey").IsNotNull(); 

    if (sessionToken.ValidTo > DateTime.UtcNow) 
    { 
     var slidingExpiration = sessionToken.ValidTo - sessionToken.ValidFrom; 

     e.SessionToken = new SessionSecurityToken(
        sessionToken.ClaimsPrincipal, 
        sessionToken.ContextId, 
        sessionToken.Context, 
        sessionToken.EndpointId, 
        slidingExpiration, 
        symmetricSecurityKey); 

     e.ReissueCookie = true; 
    } 
    else 
    { 
     var sessionAuthenticationModule = (SessionAuthenticationModule) sender; 

     sessionAuthenticationModule.DeleteSessionTokenCookie(); 

     e.Cancel = true; 
    } 
} 

Source: http://blogs.planbsoftware.co.nz/?p=5211

1

Alors que la réponse par bmeredith semble parfaitement valable, une chose dépasse.

Il semble que le jeton soit renouvelé à chaque requête, et les opérations cryptographiques ne sont généralement pas bon marché. J'ai trouvé une approche similaire mais légèrement différente qui ne renouvelle le jeton que lorsque la ½ session est passée.

J'aime aussi l'utilisation du SessionAuthenticationModule pour créer le jeton, donc nous n'avons pas mess avec les clés.

http://www.cloudidentity.com/blog/2013/05/08/sliding-sessions-for-wif-4-5/

void SessionAuthenticationModule_SessionSecurityTokenReceived(object sender, 

System.IdentityModel.Services.SessionSecurityTokenReceivedEventArgs e) 
{ 
    DateTime now = DateTime.UtcNow; 
    SessionSecurityToken sst = e.SessionToken; 
    DateTime validFrom = sst.ValidFrom; 
    DateTime validTo = sst.ValidTo; 
    if ((now < validTo) && (now > validFrom.AddMinutes((validTo.Minute - validFrom.Minute)/2))) 
    { 
     SessionAuthenticationModule sam = sender as SessionAuthenticationModule; 
     e.SessionToken = sam.CreateSessionSecurityToken(sst.ClaimsPrincipal, 
                 sst.Context, 
                 now, 
                 now.AddMinutes(2), 
                 sst.IsPersistent); 
                 e.ReissueCookie = true; 
    } 
} 
Questions connexes