2015-08-24 18 views
6

Ho un problema con i cookie permanenti in Internet Explorer, ovvero, posso impostare i cookie, ma non posso renderli persistenti. Utilizzo Internet Explorer 11 e ho provato "Opzioni Internet" -> "Avanzate" -> "Ripristina", ma non è stato di aiuto.Cookie persistente che non funziona in Internet Explorer

ho scritto questo codice di prova:

class Program { 
    public static void Main(string[] args) { 
     HttpListener listener = new HttpListener(); 
     listener.Prefixes.Add("http://+:7777/"); 
     listener.Start(); 

     ThreadPool.QueueUserWorkItem((o) = > { 
      while (listener.IsListening) { 
       ThreadPool.QueueUserWorkItem((c) = > { 
        HandleRequest(c as HttpListenerContext); 
       }, listener.GetContext()); 
      } 
     }); 

     Console.Write("Press any key to quit . . . "); 
     Console.ReadKey(true); 
     listener.Stop(); 
     listener.Close(); 
    } 

    static void HandleRequest(HttpListenerContext ctx) { 
     var cookie = ctx.Request.Cookies["TestCookie"]; 

     if (cookie == null) { 
      Console.WriteLine("Setting cookie..."); 
      var expiryDate = DateTime.UtcNow.AddDays(360); 
      ctx.Response.Headers["Set-Cookie"] = "TestCookie=some_value; Path=/; Expires=" + expiryDate.ToString("ddd, dd-MMM-yyyy H:mm:ss") + " GMT; HttpOnly"; 
     } else { 
      Console.WriteLine("Cookie: " + cookie); 
     } 
     ReturnString(ctx, "OK"); 
    } 

    protected static void ReturnString(HttpListenerContext ctx, String s) { 
     try { 
      byte[] buf = Encoding.UTF8.GetBytes(s); 
      ctx.Response.ContentLength64 = buf.Length; 
      ctx.Response.OutputStream.Write(buf, 0, buf.Length); 
     } catch (Exception e) { 

     } // suppress any exceptions 
     finally { 
      // always close the stream 
      ctx.Response.OutputStream.Close(); 
     } 
    } 
} 

Ora, quando si accede 127.0.0.1:7777, ho capito "Impostazione cookie", e poi "Cookie: TestCookie = some_value" su tutte le richieste successive. In Chrome il cookie è persistente (posso chiudere il browser, riavviarlo e ottenere ancora "Cookie: TestCookie = some_value"), ma questo non funziona in Internet Explorer. Cioè, quando si utilizza IE, ottengo il "cookie di impostazione" sulla prima richiesta ogni volta che riavvio il browser. Quindi il cookie chiaramente non c'è più.

Perché è questo? Sto facendo qualcosa di sbagliato? Sicuramente ci deve essere un modo per impostare i cookie persistenti in IE usando un server C#?

risposta

2

Hm, ho trovato la risposta. È abbastanza semplicemente imbarazzante, davvero. Quando ho impostato la data di scadenza, ho utilizzato il codice

expiryDate.ToString("ddd, dd-MMM-yyyy H:mm:ss") 

ma ovviamente questo crea una rappresentazione localizzata della data. E siccome sono in Norvegia, il "ddd" ha creato il giorno della settimana in norvegese. E naturalmente IE non è stato in grado di analizzarlo.

Questa semplice modifica ha risolto il problema:

expiryDate.ToString("ddd, dd-MMM-yyyy H:mm:ss", System.Globalization.CultureInfo.InvariantCulture) 

Mi dispiace per tutti i vostri problemi, gente ..

0

È possibile aggiungere il sito all'area attendibile in IE Properties? Sembra che potrebbe essere correlato alle impostazioni di sicurezza.

+0

Beh, posso andare a "Sicurezza" -> "Pagina Web Privacy Policy" -> click in "127.0.0.1" -> "Riepilogo" e seleziona "Consenti sempre a questo sito di utilizzare i cookie". Questo risolve il problema, ma non penso di poter richiedere agli utenti regolari di farlo. Quindi sto cercando un modo per farlo funzionare con le impostazioni predefinite di IE. –

+1

Va bene. Stavo solo cercando di stabilire lo scenario. Per quanto riguarda il motivo per cui potrebbe essere stato bloccato, probabilmente i motivi sono che potrebbe pensare che il cookie sia un cookie di terze parti (lo vedresti, ad esempio, se stai impostando il cookie su "localhost", ma poi vai a 127.0.0.1), se è impostato da un iframe o se i dati nel cookie contengono informazioni che IE ritiene possano essere utilizzate per contattarti (ad es. Indirizzo email). Con IE, spesso vale la pena includere un'intestazione P3P che dice a IE che il tuo sito non è completamente pericoloso (https://en.wikipedia.org/wiki/P3P). Hai provato P3P? –

+0

Ho sempre usato 127.0.0.1, mai localhost nel mio scenario. E senza cornici. I dati sono una stringa con codifica Base64, non assomigliano a un indirizzo email. Ho provato P3P, ma non ho ancora investito abbastanza tempo per comprenderlo correttamente, quindi in pratica ho incluso alcune cose P3P che ho trovato su google. –

Problemi correlati