2015-08-24 18 views
6

Ich habe ein Problem mit persistenten Cookies in Internet Explorer, das heißt, ich kann die Cookies setzen, aber sie können nicht bestehen bleiben. Ich benutze den Internet Explorer 11 und habe "Internetoptionen" -> "Erweitert" -> "Zurücksetzen" versucht, aber es hat nicht geholfen.Dauerhaftes Cookie funktioniert nicht im Internet Explorer

ich diesen Test-Code geschrieben haben:

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(); 
     } 
    } 
} 

Nun, wenn 127.0.0.1:7777 Zugriff ich zum ersten Mal bekommen "Einstellen Cookie", und dann "Cookie: Testcookie = some_value" auf allen weiteren Anfragen. In Chrome ist das Cookie dauerhaft (ich kann den Browser schließen, neu starten und bekomme immer noch "Cookie: TestCookie = some_value"), aber das funktioniert nicht in Internet Explorer. Das heißt, wenn ich IE benutze, erhalte ich bei jedem Neustart des Browsers den "Setting Cookie" bei der ersten Anfrage. Der Cookie ist also eindeutig nicht mehr da.

Warum ist das? Mache ich etwas falsch? Sicherlich muss es eine Möglichkeit geben, dauerhafte Cookies im IE mit einem C# -Server zu setzen?

Antwort

2

Hm, fand ich die Antwort. Es ist ziemlich peinlich einfach, wirklich. Wenn Ablaufdatum einstellen, habe ich den Code

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

aber natürlich schafft dies eine lokalisierte Darstellung des Datums. Und seit ich in Norwegen bin, hat die "ddd" den Tag der Woche auf Norwegisch kreiert. Und natürlich konnte IE das nicht analysieren.

Diese einfache Änderung das Problem gelöst:

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

So sorry für alle Mühe, Leute ..

0

Können Sie Ihre Website der vertrauenswürdigen Zone in den IE-Eigenschaften hinzufügen? Das klingt, als könnte es mit Sicherheitseinstellungen zusammenhängen.

+0

Nun, ich kann auf "Sicherheit" gehen -> "Webseite Datenschutz" -> Klick auf "127.0.0.1" -> "Zusammenfassung" und wählen Sie "Diese Seite immer erlauben, Cookies zu verwenden". Das löst das Problem, aber ich glaube nicht, dass ich regelmäßige Benutzer dazu zwingen kann. Also ich suche nach einer Möglichkeit, dies mit IE-Standardeinstellungen arbeiten zu lassen. –

+1

Das ist in Ordnung. War nur versucht, das Szenario zu etablieren. In Bezug auf die mögliche Blockierung liegt es wahrscheinlich daran, dass es sich bei dem Cookie möglicherweise um ein Drittanbieter-Cookie handelt (Sie würden dies beispielsweise sehen, wenn Sie das Cookie auf "localhost" setzen, dann aber zu 127.0.0.1), wenn es innerhalb eines Iframes gesetzt wird, oder wenn die Daten im Cookie Informationen enthalten, von denen IE glaubt, dass sie für die Kontaktaufnahme mit Ihnen verwendet werden könnten (z. B. E-Mail-Adresse). Bei IE lohnt es sich oft, einen P3P-Header einzufügen, der dem IE sagt, dass Ihre Site nicht völlig unsicher ist (https://en.wikipedia.org/wiki/P3P). Hast du P3P ausprobiert? –

+0

Ich habe immer 127.0.0.1, niemals localhost in meinem Szenario verwendet. Und keine Frames. Die Daten sind eine Base64-codierte Zeichenfolge, die keiner E-Mail-Adresse ähnelt. Ich habe P3P ausprobiert, aber ich habe noch nicht genug Zeit investiert, um es richtig zu verstehen, also habe ich gerade ein paar P3P-Sachen aufgenommen, die ich beim Googlen gefunden habe. –

Verwandte Themen