web-dev-qa-db-fra.com

Implémentation de cookie ASP.NET MVC

J'essaie d'implémenter un assistant de base de gestion des cookies dans mon application . Je vérifie généralement dans le contrôleur de base à chaque fois si un cookie est défini ou non. 

public class MyCookie
{

    public static string CookieName {get;set;}
    public virtual User User { get; set; }
    public virtual Application App { get; set; }


    public MyCookie(Application app)
    {
        CookieName = "MyCookie" + app;
        App = app;
    }

    public void SetCookie(User user)
    {
        HttpCookie myCookie = HttpContext.Current.Request.Cookies[CookieName] ?? new HttpCookie(CookieName);
        myCookie.Values["UserId"] = user.UserId.ToString();
        myCookie.Values["LastVisit"] = DateTime.Now.ToString();
        myCookie.Expires = DateTime.Now.AddDays(365);
        HttpContext.Current.Response.Cookies.Add(myCookie);
    }

    public HttpCookie GetCookie()
    {
        HttpCookie myCookie = HttpContext.Current.Request.Cookies[CookieName];
        if(myCookie != null)
        {
            int userId = Convert.ToInt32(myCookie.Values["UserId"]);
            User user = session.Get<User>(userId);
            return user;
        }
        return null;
    }
}

si la session est nulle, j'essaie d'obtenir un cookie ou si l'initialisation de la session, je crée un cookie mais je ne le vois jamais dans le navigateur. Qu'est-ce qui ne va pas?

Je commence toujours la session mais avec userId = 0 Pour obtenir un cookie et définir une session à partir d'un cookie:

if (userId == 0)
{
    MyCookie myCookie = new MyCookie(_app);
    User user = cookieHelper.GetCookie();
    if (user != null)
        SessionHelper.SetSession(user);
}
18
gandil

Ma mise en œuvre de travail (version de base)

public class CookieHelper
{

public static string CookieName {get;set;}
public virtual Application App { get; set; }


public MyCookie(Application app)
{
    CookieName = "MyCookie" + app;
}

public static void SetCookie(User user, Community community, int cookieExpireDate = 30)
{
    HttpCookie myCookie= new HttpCookie(CookieName);
    myCookie["UserId"] = user.UserId.ToString();
    myCookie.Expires = DateTime.Now.AddDays(cookieExpireDate);
    HttpContext.Current.Response.Cookies.Add(myCookie);
 }
 }

si session/cookie a la valeur null (en fait, ID utilisateur = 0)

if (userId == 0){
    CookieHelper myCookie = new Cookie(_app);
    if (myCookie  != null)
    {
        userId = Convert.ToInt32(System.Web.HttpContext.Current.Request.Cookies[myCookie.CookieName]["userId"]);
        if(userId>0)
        {
           SessionHelper.SetSession(userId);
        }
    }
}
14
gandil

Vous ne pouvez pas définir et obtenir un cookie dans la même demande. Obtenir un cookie le récupère à partir du navigateur et il ne l'a pas encore obtenu - En définissant un cookie, il sera renvoyé dans l'en-tête à la fin de la demande.

Vous devez définir le cookie et obliger le navigateur à rediriger peut-être ailleurs (par exemple, depuis/login vers/compte), puis lors de la nouvelle demande, le cookie s'affiche correctement.

EDIT: Si cette hypothèse était fausse, je voudrais également savoir où vous appelez .SetCookie () comme nulle part dans le code que vous avez fourni, appelez-vous réellement pour créer le cookie en premier lieu.

Pour déboguer ces choses, je trouve bon de prendre des morceaux du code que vous supposez devoir fonctionner, testez les Par exemple, dans le chargement de page d'une nouvelle page, j'ai entré ceci:

string CookieName = "bob";
long UserId = 4;
HttpCookie myCookie = HttpContext.Current.Request.Cookies[CookieName] ?? new HttpCookie(CookieName);
myCookie.Values["UserId"] = UserId.ToString();
myCookie.Values["LastVisit"] = DateTime.Now.ToString();
myCookie.Expires = DateTime.Now.AddDays(365);
HttpContext.Current.Response.Cookies.Add(myCookie);

Et le cookie est apparu correctement sans problème. Donc, sachant que ce code fonctionne réellement, nous pouvons supposer que l'erreur est la fonction qui n'est pas appelée ou le test/débogage que vous êtes en train de faire essaie de définir et de lire le cookie dans la même demande et qui échoue (comme je l'avais initialement indiqué)

De toute façon bonne chance!

19
White Dragon

Essaye ça 

HttpCookie cookie = new HttpCookie("Remember_Me");
cookie["userID"] = Userid.ToString();
cookie.Expires = DateTime.Now.AddMonths(3);
Response.Cookies.Add(cookie);
1
isanka thalagala