[C#] System.Net.Cookie expired bij einde browsersessie

Pagina: 1
Acties:

  • johnwoo
  • Registratie: Oktober 1999
  • Laatst online: 12:43
Ik heb een probleempje met System.Net.Cookie. Het gaat hier om een server-app met een ingebakken webinterface op basis van HttpListener. Ik doe m'n eigen authenticatie en sessiemanagement, waarbij de sessie ID naar de browser wordt gestuurd als cookie wanneer de gebruiker de juiste inloggegevens heeft ingetypt. De betreffende code:
C#:
1
2
3
4
Cookie cookie = new Cookie(Session.SESSION_COOKIE, session.ID);
cookie.Expires = DateTime.Now.AddYears(1);
response.AppendCookie(cookie);
response.Redirect(request.QueryString["goto"] == null ? "/" : request.QueryString["goto"]);

Werkt goed op één detail na: de browser laat de sessie verlopen zodra hij wordt gesloten; ofwel, de cookie wordt niet opgeslagen. Nu heeft de Cookie class ook een boolean property Discard, waarmee je juist dit aan kan geven (of de client de cookie al dan niet moet weggooien als hij gesloten wordt), maar deze staat default op false (expliciet op false zetten heeft dan ook geen effect).

Ik heb zelfs als alternatief geprobeerd om de cookie zelf te zetten, maar onderstaande code had tot gevolg dat de cookie helemaal niet ontvangen werd door de browser :?
C#:
1
2
string cookieHeader = Session.SESSION_COOKIE + "=" + session.ID + "; expires=" + DateTime.Now.ToUniversalTime().AddYears(1).ToString("ddd, dd-MMM-yyyy HH:mm:ss G\\MT", CultureInfo.InvariantCulture.DateTimeFormat) + "; domain=" + request.UserHostName + "; path=/";
response.Headers[HttpResponseHeader.SetCookie] = cookieHeader;


Ik heb het idee dat het iets heel simpels is, maar na een paar uur "klooien" en googlen ben ik er nog niet uit...

4200Wp ZO + 840Wp ZW + 1680Wp NW | 14xIQ7+ + 1xDS3-L | MTVenusE | HWP1


  • Plopeye
  • Registratie: Maart 2002
  • Laatst online: 12-12-2025
Bekijk het volgende stukje VB code eens...

Visual Basic:
1
2
3
4
5
6
7
8
9
10
11
Dim tkt As FormsAuthenticationTicket
            Dim cookiestr As String
            Dim ck As HttpCookie

            tkt = New FormsAuthenticationTicket(1, txtUserName.Value, DateTime.Now(), _
      DateTime.Now.AddMinutes(30), chkPersistCookie.Checked, "your custom data")
            cookiestr = FormsAuthentication.Encrypt(tkt)
            ck = New HttpCookie(FormsAuthentication.FormsCookieName(), cookiestr)
            If (chkPersistCookie.Checked) Then ck.Expires = tkt.Expiration
            ck.Path = FormsAuthentication.FormsCookiePath()
            Response.Cookies.Add(ck)


Hier zit een vinkje die aangeeft onthoud mijn gegevens...
Indien vinkje gezet verloopt de cookie niet...

Naam van vinkje: chkPersistCookie

Unix is user friendly, it's only selective about his friends.....


  • johnwoo
  • Registratie: Oktober 1999
  • Laatst online: 12:43
Plopeye schreef op woensdag 21 juni 2006 @ 00:48:
Bekijk het volgende stukje VB code eens...

[...]
Ik werk niet met FormsAuthenticationTickets en System.Web.HttpCookies maar direct met System.Net.Cookies (die kunnen worden toegevoegd aan HttpListenerResponse.Cookies; HttpCookies niet).
Bovendien doet dat hetzelfde als wat ik doe, namelijk een DateTime toewijzen aan de cookie's Expires property, alleen dan via een omweg (dat FormsAuthenticationTicket).

Ik vermoed dat toewijzen aan een System.Net.Cookie's Expires property gewoon niks doet, aangezien de cookie op de browser steeds verloopt bij het einde van de sessie. Er wordt ook geen exception gegenereerd overigens.

Gelukkig heb ik wel mijn alternatief werkend gekregen, namelijk het zelf maken van de Set-Cookie header. De reden dat die niet werkte zat hem in de domain attribuut in de header; die moet volgens de spec een punt bevatten. Dat was niet het geval met de app draaiend op localhost (en dus request.UserHostName == "localhost") dus accepteerde de browser de cookie niet. Zonder het domain attribuut werkt het prima, en expiret de cookie netjes over een jaar:
C#:
1
2
string cookieHeader = Session.SESSION_COOKIE + "=" + session.ID + "; expires=" + DateTime.Now.ToUniversalTime().AddYears(1).ToString("ddd, dd-MMM-yyyy HH:mm:ss G\\MT", CultureInfo.InvariantCulture.DateTimeFormat) + "; path=/";
response.Headers.Set(HttpResponseHeader.SetCookie, cookieHeader);

[ Voor 13% gewijzigd door johnwoo op 22-06-2006 12:32 ]

4200Wp ZO + 840Wp ZW + 1680Wp NW | 14xIQ7+ + 1xDS3-L | MTVenusE | HWP1