Как установить дату истечения срока действия для клиентских файлов cookie?

Я настроил Identity Server:

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

Когда пользовательский логин с опцией "Запомнить меня" Идентификатор cookie имеет истекшую дату:

idsvr.session    expires 04 October ...

Но клиентский файл cookie не работает:

.AspNet.Cookies  at end of session

Что мне делать, чтобы установить такую ​​же дату истечения срока действия клиенту cookie?

UPDATE:

Я могу установить любую дату истечения срока действия в клиентском приложении:

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

Но я не могу определить, когда устанавливать дату истечения срока. Он должен быть установлен только тогда, когда пользователь выбирает "Запомнить меня", но параметр IsPersistent всегда ложный на стороне клиента.

Проблема существует и в проекте с простым шаблоном: https://identityserver.github.io/Documentation/docsv2/overview/mvcGettingStarted.html

UPDATE2:

Мне нужно, чтобы клиентский cookie был постоянным из-за ошибки в Safari - https://openradar.appspot.com/14408523

Возможно, существует какое-то обходное решение, поэтому я могу передать дату истечения срока в обратном вызове от Identity to Client?

Update3:

Собственно, наши серверы Identity и Client имеют один и тот же родительский домен, например app.server.local и id.server.local. Может быть, я могу передать дату истечения срока действия через дополнительный файл cookie, который принадлежит родительскому домену (.server.local)? Но я понятия не имею, где это может быть написано на Identity и где оно может быть применено к клиенту.

Ответ 1

Файл cookie, выпущенный IdentityServer, и файл cookie, выданный клиентским приложением, никак не связаны. IdentityServer не контролирует файлы cookie в клиентском приложении.

При входе в систему IdentityServer выдается файл cookie, который отслеживает аутентифицированный пользователь в IdentityServer. Это позволяет пользователю вводить свои учетные данные для каждого клиентского приложения, облегчая единый вход.

По умолчанию этот файл cookie длится для этого сеанса (поэтому он истекает после закрытия браузера), иначе, если вы установите "запомнить меня", он будет длиться определенное количество дней, через сеансы.

Файл cookie в клиентском приложении будет выдан после успешной проверки токена идентификации от IdentityServer. Этот файл cookie может иметь любое время истечения срока действия, любую политику, любое имя. Он полностью контролируется клиентским приложением. В вашем случае истечение срока действия cookie клиента может быть установлено в CookieAuthenticationOptions в вашем клиентском приложении.

Ответ 2

Вам нужно обработать события аутентификации cookie. Открытое промежуточное ПО id создает файл cookie auth, поэтому вы можете обрабатывать все аспекты этого файла cookie из этих событий. Вам нужно будет посмотреть события, и с небольшим пробным и ошибочным результатом вы сможете управлять временем жизни файлов cookie.

Ответ 3

Вы можете сделать это в java- script, используя следующий код здесь. Я создал этот файл cookie для истечения срока действия в течение 14 дней.

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

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