10

I configuré Identity Server:Comment définir la date d'expiration pour les cookies client?

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" }, 
     }; 
    }); 
} 

et client serveur:

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

Lorsque la connexion de l'utilisateur avec "Remember Me" option de cookie identité a expiré Date:

idsvr.session expires 04 October ... 

Mais cookies client pas:

.AspNet.Cookies at end of session 

Que dois-je faire pour définir la même date d'expiration pour le cookie client?

MISE À JOUR:

Je peux définir une date d'expiration dans l'application client:

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

Mais je ne peux pas déterminer quand régler la date d'expiration. Il doit être défini uniquement lorsque l'utilisateur sélectionne "Remember Me", mais l'option IsPersistent est toujours false sur le côté client.

Le problème existe sur le projet de texte standard simple aussi: https://identityserver.github.io/Documentation/docsv2/overview/mvcGettingStarted.html

MAJ2:

J'ai besoin cookie client d'être persistant à cause de bug dans Safari - https://openradar.appspot.com/14408523

Peut-être une solution de contournement existe, donc je peux passer la date d'expiration dans le rappel de l'identité au client?

Update3:

En fait, nos serveurs d'identité et les clients ont le même domaine parent comme app.server.local et id.server.local. Peut-être que je peux transmettre la date d'expiration via un cookie supplémentaire appartenant au domaine parent (.server.local)? Mais je n'ai aucune idée d'où il peut être écrit sur l'identité, et où il peut être appliqué sur le client.

+1

questions visant à obtenir l'aide de débogage (« ** pourquoi ne serait-ce code? Travail ** ») doivent inclure le comportement souhaité, un problème spécifique * ou une erreur et le code le plus court nécessaire * de le reproduire ** dans la question elle-même **. Les questions sans ** un énoncé de problème clair ** ne sont pas utiles aux autres lecteurs. Voir: [Comment créer un exemple minimal, complet et vérifiable] (http://stackoverflow.com/help/mcve). –

Répondre

1

Vous devez gérer les événements auth cookie. Le middleware open id crée simplement un cookie d'authentification, de sorte que vous pouvez gérer tous les aspects de ce cookie à partir de ces événements. Vous aurez besoin de regarder les événements et avec un peu d'essais et d'erreurs, vous devriez être capable de gérer la durée de vie des cookies.

+0

Dans quel cas je peux définir la date d'expiration du cookie si l'utilisateur vérifie "Se souvenir de moi"? – Artem

2

Un cookie émis par IdentityServer et un cookie émis par une application cliente ne sont aucunement liés. IdentityServer n'a aucun contrôle sur les cookies dans une application client. Lorsque vous vous connectez à IdentityServer, un cookie suit l'identité de l'utilisateur authentifié dans IdentityServer. Cela évite à l'utilisateur d'entrer ses informations d'identification pour chaque application client, ce qui facilite la connexion unique.

Par défaut, ce cookie dure pour cette session (il expire donc une fois le navigateur fermé), sinon, si vous définissez "remember me", il durera un nombre de jours défini, entre sessions.

Un cookie dans une application cliente serait émis lors de la vérification réussie d'un jeton d'identité d'IdentityServer. Ce cookie peut avoir n'importe quelle heure d'expiration, n'importe quelle politique, n'importe quel nom. C'est complètement contrôlé par l'application cliente. Dans votre cas, l'expiration du cookie client peut être définie dans CookieAuthenticationOptions dans votre application cliente.

+0

Oui, il est complètement contrôlé par l'application cliente. Mais je dois définir la date d'expiration seulement quand IdentityServer la définit. Si l'indicateur IsPersistent sur le côté IdentityServer est false, le client doit utiliser un cookie de session. Voir la mise à jour de la question – Artem

+0

Il n'y a pas de mécanisme pour le faire. Cela devrait être une implémentation personnalisée, hors spécifications. Par curiosité, quel est le besoin du cookie client persistant? –

+0

Il y a un bug dans Safari - http://openradar.appspot.com/14408523, j'ai donc besoin d'un cookie persistant comme solution de contournement. – Artem

1

Vous pouvez le faire au script java en utilisant le code suivant ici. J'ai créé ce cookie qui expire dans les 14 jours.

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

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

Les cookies de client et d'identité sont httpOnly pour des raisons de sécurité. – Artem