如何设置客户端cookie的截止日期?

时间:2017-10-04 16:47:12

标签: cookies asp.net-identity session-cookies identityserver3 katana

我配置了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);
}

当用户使用&#34;记住我&#34;选项标识cookie已过期日期:

idsvr.session    expires 04 October ...

但客户端cookie不会:

.AspNet.Cookies  at end of session

如何为客户端Cookie设置相同的到期日期?

更新

我可以在客户端应用程序中设置任何到期日期:

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

但我无法确定何时设置到期日期。它应该仅在用户选择&#34;记住我&#34;时才设置,但IsPersistent选项在客户端始终为false。

简单的样板项目也存在问题: https://identityserver.github.io/Documentation/docsv2/overview/mvcGettingStarted.html

UPDATE2:

由于Safari中的错误,我需要客户端cookie持久化 - https://openradar.appspot.com/14408523

也许存在一些解决方法,所以我可以在回调中将过期日期从Identity传递给客户端?

UPDATE3:

实际上,我们的身份和客户端服务器具有相同的父域,如app.server.localid.server.local。也许我可以通过属于父域(.server.local)的附加cookie来传递到期日期?但是我不知道它可以写在Identity上的哪个位置,以及它可以在客户端上应用的地方。

3 个答案:

答案 0 :(得分:2)

IdentityServer发布的cookie和客户端应用程序发布的cookie不以任何方式链接。 IdentityServer对客户端应用程序中的cookie没有任何控制权。

当您登录IdentityServer时,会向您发出一个cookie,用于跟踪IdentityServer中经过身份验证的用户。这样可以避免用户输入每个客户端应用程序的凭据,从而促进单点登录。

默认情况下,此Cookie会持续该会话(因此一旦浏览器关闭就会过期),否则如果您设置了#34;请记住我&#34;它将持续一段时间,跨会议。

从IdentityServer成功验证身份令牌后,将发出客户端应用程序中的cookie。此cookie可以包含任何到期时间,任何策略,任何名称。它完全由客户端应用程序控制。在您的情况下,客户端cookie过期可以在客户端应用程序的CookieAuthenticationOptions中设置。

答案 1 :(得分:1)

您需要处理cookie auth事件。 open id中间件只是创建一个auth cookie,因此你可以从这些事件中处理这个cookie的所有方面。您需要查看事件,只需稍加试错,就可以管理cookie的生命周期。

答案 2 :(得分:1)

您可以使用以下代码在java脚本中执行此操作我已创建此cookie以在14天内过期。

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

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