web-dev-qa-db-fra.com

Comment créer des cookies persistants dans asp.net?

Je crée des cookies avec les lignes suivantes:

HttpCookie userid = new HttpCookie("userid", objUser.id.ToString());
userid.Expires.AddYears(1);
Response.Cookies.Add(userid);

Maintenant, comment le rendre persistant?

Parce que si je retourne à la même page après avoir fermé le navigateur, je ne pourrai pas le récupérer.

63
Vikas

Voici comment vous pouvez le faire.

Ecrire le cookie persistant.

//create a cookie
HttpCookie myCookie = new HttpCookie("myCookie");

//Add key-values in the cookie
myCookie.Values.Add("userid", objUser.id.ToString());

//set cookie expiry date-time. Made it to last for next 12 hours.
myCookie.Expires = DateTime.Now.AddHours(12);

//Most important, write the cookie to client.
Response.Cookies.Add(myCookie);

Lecture du cookie persistant.

//Assuming user comes back after several hours. several < 12.
//Read the cookie from Request.
HttpCookie myCookie = Request.Cookies["myCookie"];
if (myCookie == null)
{
    //No cookie found or cookie expired.
    //Handle the situation here, Redirect the user or simply return;
}

//ok - cookie is found.
//Gracefully check if the cookie has the key-value as expected.
if (!string.IsNullOrEmpty(myCookie.Values["userid"]))
{
    string userId = myCookie.Values["userid"].ToString();
    //Yes userId is found. Mission accomplished.
}
90

Bien que la réponse acceptée soit correcte, elle ne précise pas pourquoi le code d'origine n'a pas fonctionné.

Mauvais code de votre question:

HttpCookie userid = new HttpCookie("userid", objUser.id.ToString());
userid.Expires.AddYears(1);
Response.Cookies.Add(userid);

Regardez la deuxième ligne. La base de l'expiration repose sur la propriété Expires qui contient la valeur par défaut 1/1/0001. Le code ci-dessus est évalué à 1/1/0002. De plus, l'évaluation n'est pas sauvegardée dans la propriété. Au lieu de cela, la propriété Expires doit être définie avec la base de la date actuelle.

Code corrigé:

HttpCookie userid = new HttpCookie("userid", objUser.id.ToString());
userid.Expires = DateTime.Now.AddYears(1);
Response.Cookies.Add(userid);
38
Chance

FWIW fait très attention de ne pas stocker quelque chose comme un ID utilisateur dans un cookie non crypté. Cela rend votre site très sujet aux intoxications par les cookies, où les utilisateurs peuvent facilement se faire passer pour un autre utilisateur. Si vous envisagez quelque chose comme cela, je vous recommande fortement d'utiliser directement le cookie d'authentification par formulaires.

bool persist = true;

var cookie = FormsAuthentication.GetAuthCookie(loginUser.ContactId, persist);

cookie.Expires = DateTime.Now.AddMonths(3);

var ticket = FormsAuthentication.Decrypt(cookie.Value);

var userData = "store any string values you want inside the ticket
                 extra than user id that will be encrypted"

var newTicket = new FormsAuthenticationTicket(ticket.Version, ticket.Name,
     ticket.IssueDate, ticket.Expiration, ticket.IsPersistent, userData);

cookie.Value = FormsAuthentication.Encrypt(newTicket);

Response.Cookies.Add(cookie);

Ensuite, vous pouvez lire ceci à tout moment depuis une page ASP.NET en faisant 

string userId = null;
if (this.Context.User.Identity.IsAuthenticated) 
{
    userId = this.Context.User.Identity.Name;
}
24
Chris Marisic

Si j'ai bien compris, vous utilisez l'authentification ASP.NET et pour définir des cookies persistants, vous devez définir FormsAuthenticationTicket.IsPersistent = trueIl s'agit de l'idée principale.

bool isPersisted = true;
var authTicket = new FormsAuthenticationTicket(
1,
user_name, 
DateTime.Now,
DateTime.Now.AddYears(1),//Expiration (you can set it to 1 year)
isPersisted,//THIS IS THE MAIN FLAG
addition_data);
    HttpCookie authCookie = new HttpCookie(FormsAuthentication.FormsCookieName, authTicket );
    if (isPersisted)
        authCookie.Expires = authTicket.Expiration;

HttpContext.Current.Response.Cookies.Add(authCookie);
2
Kate

Vous devez ajouter ceci comme dernière ligne ...

HttpContext.Current.Response.Cookies.Add(userid);

Lorsque vous devez lire la valeur du cookie, vous devez utiliser une méthode semblable à celle-ci:

    string cookieUserID= String.Empty;

    try
    {
        if (HttpContext.Current.Request.Cookies["userid"] != null)
        {
            cookieUserID = HttpContext.Current.Request.Cookies["userid"];
        }
    }
    catch (Exception ex)
    {
       //handle error
    }

    return cookieUserID;
0
Robert Williams

// ajouter un cookie

var panelIdCookie = new HttpCookie("panelIdCookie");
panelIdCookie.Values.Add("panelId", panelId.ToString(CultureInfo.InvariantCulture));
panelIdCookie.Expires = DateTime.Now.AddMonths(2); 
Response.Cookies.Add(panelIdCookie);

// lire le cookie

    var httpCookie = Request.Cookies["panelIdCookie"];
                if (httpCookie != null)
                {
                    panelId = Convert.ToInt32(httpCookie["panelId"]);
                }
0
Diganta Kumar