Question

Le stockage de la session entière dans un cookie est devenu la norme dans Rails ces dernières années. Existe-t-il un moyen simple de réaliser quelque chose de similaire avec ASP MVC?

Par défaut, tout ce qui se trouve dans Session / TempData est stocké en mémoire sur le serveur. Dans web.config, cela peut être remplacé par un cache SQL Store / côté serveur. J'aimerais pouvoir faire en sorte que ces objets persistent dans un cookie.

Il semble que je puisse implémenter un fournisseur de magasin d'état de session personnalisé. Existe-t-il une approche plus simple?

Était-ce utile?

La solution

oui, implémentez un fournisseur de session à l'état personnalisé . Et non, autant que je sache, il n'y a pas d'approche plus simple.

Ps. ce n'est pas aussi grave qu'il n'y paraît, par exemple, > La moitié de l exemple d'odbc écrit sur la base de données.

Autres conseils

Je pense qu'il serait beaucoup plus efficace de simplement stocker l'ID de session (un hachage ou autre) dans le cookie, puis d'utiliser cet ID pour obtenir les données de session de la mémoire / de la base de données / quel que soit le stockage que vous préférez. Conserver l'état de la session complète dans un cookie augmente inévitablement la bande passante.

Tenez également compte de la sécurité: si le cookie contient des informations d’authentification ou d’autres données sensibles et que vous ne faites pas attention, il peut facilement être piraté par l’utilisateur pour obtenir des privilèges ou gâcher votre application de quelque manière que ce soit (le cryptage des données est également nul) , car vous devez alors coder en base 64 les données chiffrées, ce qui gaspille davantage de bande passante et de temps de traitement). Vous ne devez jamais faire confiance aux entrées de l'utilisateur.

Je déconseillerais fortement de stocker toute la session dans des cookies. Cela a des conséquences néfastes sur les performances. Considérez ceci: chaque requête (à chaque ressource) contiendra une surcharge de données éventuellement obsolètes dont vous n’auriez besoin qu’une ou deux fois. Cette surcharge finira par toucher vos utilisateurs, votre bande passante et les performances de votre site.

Voici un exemple:

GET / HTTP/1.1
Host: localhost
OtherUsefulHeaders: foo
Cookie: YourSessionState=...

La taille de la demande initiale est d'environ 200 octets. Disons que vous ajoutez environ 100 octets à votre session. Maintenant, la taille est de 300 octets et les frais généraux d'environ 30%. Vous ajoutez 100 autres octets et les frais généraux sont de 50%. Ce qui signifie qu'il faut environ deux fois plus de temps pour envoyer la requête et deux fois plus de bande passante.

Vous devriez plutôt regarder dans implémentation de TempData basée sur les cookies , car son encombrement est beaucoup plus petit et a donc un sens.

Je recommande de stocker TempData dans le cookie (par opposition à la session entière).

Pour stocker TempData dans le cookie, vous devez remplacer ITempDataProvider et implémenter votre propre fournisseur personnalisé.

Un package de nuget est actuellement disponible (qui réalise cette implémentation personnalisée pour vous): BrockAllen.CookieTempData et voici la documentation . La bonne chose à propos de ce paquet, c'est qu'il compresse et crypte votre TempData , de sorte que vous n'avez pas à vous soucier de l'envoi de texte brut sur Internet.

Tout ce que vous avez à faire est d'installer le package de nuget, puis de remplacer CreateTempDataProvider dans votre classe ControllerBase :

using BrockAllen.CookieTempData;

namespace myProject.web.Controllers
{
    public class ControllerBase : Controller
    {
        // use CookieTempDataProvider instead of default provider
        protected override ITempDataProvider CreateTempDataProvider()
        {
            return new CookieTempDataProvider();
        }
    }
}

Vous ne devriez pas utiliser Sessions pour cela, mais Profils à la place. Les profils utilisent des cookies pour faire correspondre les ordinateurs aux profils, etc. La clé de profil est stockée dans un cookie et n'est pas perdue lors de la fermeture du navigateur, etc.

Info ici; http://odetocode.com/articles/440.aspx

dépend du type de données que vous souhaitez stocker dans le cookie. Si vous souhaitez simplement stocker une chaîne, le code suivant fera l'affaire:

HttpCookie cookie = new HttpCookie("username","sth");
            cookie.HttpOnly = true;
            cookie.Expires = DateTime.Now.AddMonths(3);
            HttpContext.Current.Response.Cookies.Add(cookie);
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top