10

konfiguriert I Identity Server:Wie setze ich das Ablaufdatum auf Client-Cookies?

public void Configuration(IAppBuilder app) 
{ 
    var factory = new IdentityServerServiceFactory().UseInMemoryClients(new Client[] { 
     new Client() 
     { 
      ClientName = "MyClient", 
      ClientId = "MyClientId", 
      Enabled = true, 
      Flow = Flows.Implicit, 
      RedirectUris = new List<string> { "MyClientServer/callback" }, 
     }; 
    }); 
} 

und Client-Server:

public void Configuration(IAppBuilder app) 
{ 
    var cookieOptions = new CookieAuthenticationOptions(); 
    cookieOptions.AuthenticationType = "Cookies"; 
    app.UseCookieAuthentication(cookieOptions); 

    var authenticationOptions = new OpenIdConnectAuthenticationOptions() { 
     Authority = "https://MyIdentityServer/core", 
     ClientId = "MyClientId", 
     SignInAsAuthenticationType = "Cookies", 
     UseTokenLifetime = true, 
     RedirectUri = "MyClientServer/callback" 
    }); 

    app.UseOpenIdConnectAuthentication(authenticationOptions); 
} 

Wenn Benutzer-Login mit "Remember Me" Option Identität Cookie abgelaufen Datum hat:

idsvr.session expires 04 October ... 

Aber Client-Cookie nicht:

.AspNet.Cookies at end of session 

Was kann ich tun, um das gleiche Ablaufdatum für den Client-Cookie festzulegen?

UPDATE:

ich jedes Ablaufdatum in Client-Anwendung einstellen:

authenticationOptions.Provider = new CookieAuthenticationProvider() 
{ 
    OnResponseSignIn = (context) => 
    { 
     var isPersistent = context.Properties.IsPersistent; 
     if (isPersistent) // Always false 
     { 
      context.CookieOptions.Expires = DateTime.UtcNow.AddDays(30); 
     } 
    } 
}; 

Aber ich kann nicht bestimmen, wann das Ablaufdatum einzustellen. Es sollte nur festgelegt werden, wenn der Benutzer "Remember Me" auswählt, die IsPersistent-Option jedoch immer auf der Clientseite falsch ist. Auch

Das Problem auf einfache Text Projekt existiert: https://identityserver.github.io/Documentation/docsv2/overview/mvcGettingStarted.html

UPDATE2:

Ich brauche Client Cookie wegen Fehler in Safari hartnäckig zu sein - https://openradar.appspot.com/14408523

Vielleicht einige Abhilfe besteht, kann ich das Ablaufdatum im Callback von Identity zum Client weitergeben?

UPDATE3:

Eigentlich unsere Identität und Client-Server verfügen über gleiche übergeordnete Domäne wie app.server.local und id.server.local. Vielleicht kann ich das Ablaufdatum über ein zusätzliches Cookie übergeben, das zur übergeordneten Domain gehört (.server.local)? Aber ich habe keine Ahnung, wo es auf Identity geschrieben werden kann und wo es auf den Client angewendet werden kann.

+1

Fragen Debug-Hilfe zu suchen („**, warum nicht dieser Code funktioniert? **“) muss das gewünschte Verhalten, ein * spezifisches Problem oder Fehler und die kürzesten Code erforderlich * umfassen, es zu reproduzieren ** in die Frage selbst **. Fragen ohne ** eine klare Problemstellung ** sind für andere Leser nicht nützlich. Siehe: [Erstellen eines minimalen, vollständigen und überprüfbaren Beispiels] (http://stackoverflow.com/help/mcve). –

Antwort

1

Sie müssen mit den Cookie-Authentifizierungs-Ereignissen umgehen. Die Open-ID-Middleware erstellt lediglich einen Authentifizierungs-Cookie, sodass Sie alle Aspekte dieses Cookies von diesen Ereignissen aus behandeln können. Sie müssen sich die Ereignisse ansehen und mit ein wenig Versuch und Irrtum sollten Sie in der Lage sein, die Cookie-Lebensdauer zu verwalten.

+0

In welchem ​​Fall kann ich das Cookie-Ablaufdatum setzen, wenn der Benutzer "Remember Me" ("Erinnere mich") überprüft? – Artem

2

Ein von IdentityServer ausgestellter Cookie und ein von einer Clientanwendung ausgestellter Cookie sind in keiner Weise verknüpft. IdentityServer hat keine Kontrolle über Cookies in einer Client-Anwendung.

Wenn Sie sich bei IdentityServer anmelden, erhalten Sie ein Cookie, das den authentifizierten Benutzer in IdentityServer protokolliert. Dies erspart dem Benutzer die Eingabe seiner Anmeldedaten für jede Client-Anwendung und erleichtert so die einmalige Anmeldung.

Standardmäßig dauert dieser Cookie für diese Sitzung (er läuft also ab, sobald der Browser geschlossen wird). Wenn Sie "remember me" einstellen, wird dies für eine bestimmte Anzahl von Tagen zwischen den Sitzungen dauern.

Ein Cookie in einer Client-Anwendung würde nach der erfolgreichen Überprüfung eines Identitäts-Tokens von IdentityServer ausgestellt werden. Dieser Cookie kann jede Ablaufzeit, jede Richtlinie, jeden Namen haben. Es wird vollständig von der Client-Anwendung gesteuert. In Ihrem Fall kann der Ablauf des Client-Cookies in Ihrer Client-Anwendung unter CookieAuthenticationOptions festgelegt werden.

+0

Ja, es wird vollständig von der Client-Anwendung gesteuert. Aber ich muss das Ablaufdatum nur festlegen, wenn es von IdentityServer festgelegt wird. Wenn das IsPersistent-Flag auf der IdentityServer-Seite den Wert false hat, sollte die Clientseite ein Sitzungscookie verwenden. Siehe Aktualisierung der Frage. – Artem

+0

Dafür gibt es keinen Mechanismus. Dies müsste eine benutzerdefinierte Implementierung sein, außerhalb der Spezifikation. Aus Neugier, was ist der Bedarf für den dauerhaften Client-Cookie? –

+0

Es gibt einen Fehler in Safari - http://openradar.appspot.com/14408523, also brauche ich einen dauerhaften Cookie als Workaround. – Artem

1

Sie können es mit dem Java-Skript tun, indem Sie den folgenden Code hier verwenden Ich habe dieses Cookie erstellt, um innerhalb von 14 Tagen abläuft.

var exdate = new Date(); 
exdate.setDate(exdate.getDate() + 14); 

document.cookie = "yourcookie=" + yourCookieValue + ";expires=" + exdate.toUTCString() + ";"; 
+1

Client- und Identitätscookies sind aus Sicherheitsgründen httpOnly. – Artem

Verwandte Themen