10

skonfigurowałem Identity Serwer:Jak ustawić datę wygaśnięcia na pliki cookie klienta?

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

i klient-serwer:

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

Podczas logowania użytkownika z "Remember Me" ciasteczka opcja Identity wygasła data:

idsvr.session expires 04 October ... 

Ale klient ciasteczka nie:

.AspNet.Cookies at end of session 

Co należy zrobić, aby ustawić tę samą datę wygaśnięcia na plik cookie klienta?

UPDATE:

mogę ustawić dowolną datę ważności w aplikacji klienckiej:

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

Ale nie mogę określić, kiedy należy ustawić datę ważności. Powinien być ustawiony tylko wtedy, gdy użytkownik wybierze opcję "Remember Me", ale opcja IsPersistent zawsze będzie fałszywa po stronie klienta.

Problem istnieje w prosty projekt boilerplate też: https://identityserver.github.io/Documentation/docsv2/overview/mvcGettingStarted.html

Update2:

muszę cookies klient nie będzie trwała z powodu błędów w Safari - https://openradar.appspot.com/14408523

Może jakiś obejście istnieje, więc mogę przekazać datę wygaśnięcia w oddzwanianiu od tożsamości do klienta?

UPDATE3:

Faktycznie, nasze serwery tożsamości klienta i mają tę samą domenę nadrzędną jak app.server.local i id.server.local. Może mogę przekazać datę wygaśnięcia za pomocą dodatkowego pliku cookie, który należy do domeny nadrzędnej (.server.local)? Ale nie mam pojęcia, gdzie można go zapisać na Tożsamości i gdzie można go zastosować na Kliencie.

+1

pytania szuka pomocy debugowania („**, dlaczego nie jest to kod działa? **”) musi zawierać pożądane zachowanie, a * konkretny problem lub błąd i najkrótszą kodu niezbędnego * aby go odtworzyć ** w samo pytanie **. Pytania bez ** jasnego stwierdzenia problemu ** nie są przydatne dla innych czytelników. Zobacz: [Jak utworzyć przykład minimalny, kompletny i sprawdzalny] (http://stackoverflow.com/help/mcve). –

Odpowiedz

1

Musisz obsługiwać zdarzenia autoryzacji plików cookie. Oprogramowanie pośrednie open id tworzy plik cookie uwierzytelniania, dzięki czemu można obsługiwać wszystkie aspekty tego pliku cookie z tych zdarzeń. Będziesz musiał przyjrzeć się wydarzeniom, a przy odrobinie prób i błędów powinieneś być w stanie zarządzać ich żywotnością.

+0

W którym przypadku mogę ustawić datę ważności plików cookie, jeśli użytkownik zaznaczy "Remember Me"? – Artem

2

Plik cookie wydany przez IdentityServer i plik cookie wydany przez aplikację kliencką nie są w żaden sposób powiązane. IdentityServer nie ma żadnej kontroli nad plikami cookie w aplikacji klienckiej.

Po zalogowaniu się do serwera tożsamości otrzymasz plik cookie, który śledzi uwierzytelnionego użytkownika w ramach serwera IdentityServer. Dzięki temu użytkownik nie będzie mógł wprowadzać swoich danych uwierzytelniających dla każdej aplikacji klienckiej, ułatwiając pojedyncze logowanie.

Domyślnie ten plik cookie trwa dla tej sesji (więc wygasa, gdy przeglądarka zostanie zamknięta), w przeciwnym razie ustawienie "zapamiętaj mnie" będzie trwało przez określoną liczbę dni w różnych sesjach.

Plik cookie w aplikacji klienckiej zostanie wydany po pomyślnej weryfikacji tokenu tożsamości od serwera tożsamości. Ten plik cookie może mieć dowolny czas wygaśnięcia, dowolną politykę, dowolną nazwę. Jest całkowicie kontrolowany przez aplikację kliencką. W twoim przypadku wygaśnięcia cookie klienta można ustawić w CookieAuthenticationOptions w aplikacji klienckiej.

+0

Tak, jest całkowicie kontrolowany przez aplikację kliencką. Ale muszę ustawić datę wygaśnięcia tylko wtedy, gdy ustawia ją IdentityServer. Jeśli flaga IsPersistent na stronie serwera tożsamości ma wartość false, strona klienta powinna użyć pliku cookie sesji. Zobacz aktualizację pytania. – Artem

+0

Nie ma mechanizmu, aby to zrobić. To musiałaby być niestandardowa implementacja, poza specyfikacją. Z czystej ciekawości, jaka jest potrzeba trwałego pliku cookie klienta? –

+0

Istnieje błąd w Safari - http://openradar.appspot.com/14408523, więc potrzebuję trwałego pliku cookie jako obejścia. – Artem

1

Możesz to zrobić za pomocą skryptu java, używając poniższego kodu. Plik cookie został utworzony w ciągu 14 dni.

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

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

Pliki cookie i tożsamość cookie są httpOnly ze względów bezpieczeństwa. – Artem

Powiązane problemy