2017-08-30 1 views
1

J'ai une application MVC, avec SS intégrée pour toutes les BLL qui ont une fonctionnalité de panier. Je veux que les utilisateurs anonymes puissent ajouter au panier et continuer à faire des achats avec les détails du panier intacts quand ils reviennent - donc je pense que l'utilisation du ss-pid pour sessionId en redis est la meilleure approche.Approche recommandée pour la gestion des sessions non authentifiées sur ServiceStack

Est-ce que quelqu'un pourrait me confirmer si j'aborde ce problème, et si oui, comment activer cette fonctionnalité? (Je ne vois pas comment utiliser ss-pid par défaut).

Merci.

Répondre

1

Si vous voulez utiliser les cookies de session pour stocker Infos Unauthenticated utilisateur alors vous voulez définir:

Plugins.Add(new AuthFeature(...) { 
    GenerateNewSessionCookiesOnAuthentication = false 
}); 

Ainsi, lorsque l'utilisateur fait l'authentifier préserve les cookies existants, sinon vous voulez définir et utiliser vos propres cookies qui ne sont pas affectés lorsqu'un utilisateur se connecte.

Le SessionBag est une bonne solution pour cela qui utilise les cookies de session des utilisateurs pour stocker les données de session pour les utilisateurs non authentifiés, par exemple vous pouvez remplir une coutume POCO avec quelque chose comme:

var unAuthInfo = SessionBag.Get<UnAuthInfo>() ?? new UnAuthInfo(); 
unAuthInfo.CustomInfo = request.CustomInfo; 
SessionBag.Set(unAuthInfo); 

Ensuite, lorsqu'un utilisateur authentifie, récupérer les informations du sac session et ajoutez sur votre dactylographié personnalisée UserSession en utilisant l'événement OnAuthenticated(), par exemple:

public class CustomUserSession : AuthUserSession 
{ 
    [DataMember] 
    public string CustomInfo { get; set; } 

    public override void OnAuthenticated(IServiceBase authService, IAuthSession session, 
     IAuthTokens tokens, Dictionary<string, string> authInfo) 
    { 
     var unAuthInfo = authService.GetSessionBag().Get<UnAuthInfo>(); 

     if (unAuthInfo != null) 
      this.CustomInfo = unAuthInfo.CustomInfo; 
    } 
} 
+0

En supposant que je veux utiliser les cookies de la session SS, y a-t-il un moyen de faire en sorte que les utilisateurs anon utilisent l'identifiant de session ss-pid par défaut? – richardwhatever

+0

@richardwhatever soit changez le [ss-opt Session Cookie] (http://docs.servicestack.net/sessions) en 'ss-opt = perm' ou vous pouvez le forcer avec' var sessionBag = new SessionFactory.SessionCacheClient (Cache , Request.GetPermanentSessionId()); ' – mythz

+0

Lorsque je mets ss-opt = perm il ne semble pas être assez tôt dans la requête initiale (nouvel utilisateur, pas de cookies), et en tant que tel la session est créée en redis avec le ss-id. La réponse contient alors ss-opt = perm, puis à la demande suivante une nouvelle session utilisateur anon est créée cette fois en utilisant ss-pid, laissant la session ss-id redondante dans le cache. Comment puis-je m'assurer qu'une nouvelle demande d'utilisateur est immédiatement stockée avec ss-pid? – richardwhatever