IdentityServer4如何设置服务器cookie过期

时间:2018-03-19 15:51:06

标签: cookies identityserver4

到目前为止,我已经看到如何为客户端webapp的cookie设置过期(谢谢你v0id):IdentityServer4 cookie expiration

IdentityServer4实际上使用了两个cookie - 客户端cookie和服务器cookie(“idsrv”)。

如果我将客户端cookie过期设置为: IdentityServer4 cookie expiration 然后,当我关闭浏览器并返回到我需要获得授权的客户端webapp页面时,我会拒绝访问,因为浏览器会话不再具有服务器cookie。

所以我需要一种方法来将“idsrv”cookie过期设置为与客户端相同。

目前,我看到设置服务器cookie的最佳方式(它被忽略或以某种方式丢弃)是IdentityServer4主机Startup.cs / ConfigureServices()方法中的以下代码块:

services.AddIdentityServer(options =>
            {
                options.Authentication.CookieLifetime = new TimeSpan(365, 0, 0, 0);
                options.Authentication.CookieSlidingExpiration = true;
            })

这应该将cookie的到期时间设置为一年之后。但是,在“应用程序”选项卡下的Chrome开发人员工具中,我发现它在1969年的过期默认日期仍然过期。

我下载了IdentityServer4项目源,删除了nuget包,并将源项目添加到我的解决方案中,以便我可以通过它进行调试。

我看到它在ConfigureInternalCookieOptions.cs / Configure()方法中得到了它的到期。它也匹配DefaultCookieAuthenticationScheme内部/应用属性。我没有发现任何特定于IdentityServer的内容会忽略我设置的到期日期,但它仍然有1969年到期。

编辑:我试图在IdentityServer主机的AccountController中设置cookie持久性如下(有趣的是,微软有一篇关于在不使用AspNet身份的情况下使用身份验证属性的好文章:https://docs.microsoft.com/en-us/aspnet/core/security/authentication/cookie?tabs=aspnetcore2x - 它正在发送信息一个cookie,“scheme”只是cookie名称): 在ExternalLoginCallback()中:

if (id_token != null)
        {
            props = new AuthenticationProperties();
            props.ExpiresUtc = DateTimeOffset.UtcNow.Add(AccountOptions.RememberMeLoginDuration);
            props.IsPersistent = true;
            props.StoreTokens(new[] { new AuthenticationToken { Name = "id_token", Value = id_token } });
        }

没有服务器端cookie设置过期(AccountOptions RememberMeLoginDuration也设置为365天)。 “idsrv”和“idsrv.session”仍有1969年到期。

2 个答案:

答案 0 :(得分:0)

您可以在Startup.cs中注册Identity Server时配置Identity Server的身份验证cookie生存期,如下所示:

services.AddIdentityServer(options =>
{
    options.Authentication.CookieLifetime = TimeSpan.FromHours(10);
})

注意:您还需要在登录用户时指明cookie应该是持久的。如果您正在使用Quickstart UI,那么您必须勾选"记住我"登录屏幕上的复选框以获取持久性cookie。或者您可以修改代码以始终发出持久性cookie - 如下所示:

HttpContext.SignInAsync(subject, name, new AuthenticationProperties{ IsPersistent = true});

答案 1 :(得分:0)

我使用以下代码设置了 IdentityServer cookie 配置。当我通过 IdentityServ 中的(记住我)选项存储 cookie 时

 // Set identity cookie options
 services.ConfigureApplicationCookie(options =>
 {
     options.ExpireTimeSpan = TimeSpan.FromDays(30);
     options.SlidingExpiration = true;
     options.Cookie.SecurePolicy = Microsoft.AspNetCore.Http.CookieSecurePolicy.SameAsRequest;
 });