10

나는 신원 서버를 구성 :클라이언트 쿠키에 만료 날짜를 설정하는 방법은 무엇입니까?

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

및 클라이언트 서버 :

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

때 "기억 나"옵션 신원 쿠키가 만료 날짜 사용자 로그인 :

idsvr.session expires 04 October ... 

그러나 클라이언트 쿠키 않는 :

.AspNet.Cookies at end of session 

클라이언트 쿠키에 동일한 만료 날짜를 설정하려면 어떻게해야합니까?

UPDATE :

나는 클라이언트 응용 프로그램의 만료 날짜를 설정할 수 있습니다

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

을하지만 유효 기간을 설정할 때 확인할 수 없습니다. 사용자가 "Remember Me"를 선택할 때만 설정해야하지만 클라이언트 측에서 항상 IsPersistent 옵션은 false입니다.

문제는 너무 단순 보일러 프로젝트에 존재 : https://identityserver.github.io/Documentation/docsv2/overview/mvcGettingStarted.html

UPDATE2 :

나는 클라이언트 쿠키 때문에 사파리의 버그 지속 할 필요가 - https://openradar.appspot.com/14408523

어쩌면 몇 가지 해결 방법이 존재, 따라서 Identity에서 Client로 콜백되는 만료 날짜를 전달할 수 있습니까?

갱신 3은 :

사실, 우리의 정체성 및 클라이언트 서버 app.server.localid.server.local 같은 동일한 상위 도메인을 가지고있다. 어쩌면 상위 도메인 (.server.local)에 속한 추가 쿠키를 통해 만료일을 전달할 수 있습니까? 그러나 Identity에 서술 할 수있는 부분과 클라이언트에 적용 할 수있는 부분에 대해서는 잘 모릅니다.

+1

질문 ("** 왜 작동이 코드? **이되지 않는다") **의 문제점을 재현하기 위해 원하는 동작하는 * 특정 문제 또는 오류 최단 코드 필요한 *를 포함해야 질문 자체 **. ** 명확한 문제 성명 **이없는 질문은 다른 독자에게 유용하지 않습니다. 참조 : [최소한의 완전하고 검증 가능한 예제를 만드는 방법] (http://stackoverflow.com/help/mcve). –

답변

1

쿠키 승인 이벤트를 처리해야합니다. 공개 ID 미들웨어는 인증 쿠키를 생성하기 때문에 이러한 이벤트에서이 쿠키의 모든 측면을 처리 할 수 ​​있습니다. 이벤트를 살펴보고 약간의 시행 착오를 거쳐 쿠키 수명을 관리 할 수 ​​있어야합니다.

+0

어떤 경우에 사용자가 "Remember Me"를 체크하면 쿠키 만료일을 설정할 수 있습니까? – Artem

2

IdentityServer에서 발급 한 쿠키와 클라이언트 응용 프로그램에서 발급 한 쿠키는 어떤 방식으로도 링크되지 않습니다. IdentityServer는 클라이언트 응용 프로그램의 쿠키를 제어하지 않습니다.

IdentityServer에 로그인하면 IdentityServer 내의 인증 된 사용자를 추적하는 쿠키가 발급됩니다. 이렇게하면 사용자가 모든 클라이언트 응용 프로그램에 대한 자격 증명을 입력하지 않아도되므로 단일 로그온을 쉽게 할 수 있습니다.

기본적으로이 쿠키는 해당 세션에 대해 지속되므로 (브라우저가 닫히면 만료됩니다) 그렇지 않으면 "remember me"를 설정하면 세션 전체에서 설정된 일수 동안 지속됩니다.

IdentityServer에서 ID 토큰을 성공적으로 확인할 때 클라이언트 응용 프로그램의 쿠키가 발행됩니다. 이 쿠키는 만기 시간, 정책, 이름을 가질 수 있습니다. 그것은 클라이언트 응용 프로그램에 의해 완전히 제어됩니다. 귀하의 경우 클라이언트 쿠키 만료는 클라이언트 응용 프로그램의 CookieAuthenticationOptions에서 설정할 수 있습니다.

+0

예, 클라이언트 응용 프로그램에 의해 완전히 제어됩니다. 하지만 IdentityServer가 설정 한 경우에만 만료 날짜를 설정해야합니다. IdentityServer 측의 IsPersistent 플래그가 false이면 클라이언트 측에서 세션 쿠키를 사용해야합니다. 질문 업데이트를 참조하십시오. – Artem

+0

이렇게 할 수있는 메커니즘이 없습니다. 이것은 사양을 벗어난 사용자 지정 구현이어야합니다. 호기심에서 영구 클라이언트 쿠키가 필요한 이유는 무엇입니까? –

+0

Safari - http://openradar.appspot.com/14408523에 버그가 있으므로 해결 방법으로 영구 쿠키가 필요합니다. – Artem

1

다음 코드를 사용하여 자바 스크립트에서 할 수 있습니다.이 쿠키가 14 일 이내에 만료되도록 만들었습니다. 디버깅 도움을 구하고

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

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

보안상의 이유로 클라이언트 및 ID 쿠키는 http 전용입니다. – Artem