IdentityServer4 实际上使用了两个 cookie——客户端 cookie 和服务器 cookie("idsrv")。
如果按照此处提供的方法设置客户端 cookie 的过期时间:IdentityServer4 cookie expiration,那么当我关闭浏览器并返回需要授权的客户端 Web 应用程序页面时,我会因为浏览器会话不再具有服务器 cookie 而被拒绝访问。
因此,我需要一种方法将 "idsrv" cookie 的过期时间设置为与客户端相同。
目前,我认为在 IdentityServer4 主机 Startup.cs / ConfigureServices() 方法中使用以下代码块是设置服务器 cookie(它被忽略或丢弃了)的最佳方式:
services.AddIdentityServer(options =>
{
options.Authentication.CookieLifetime = new TimeSpan(365, 0, 0, 0);
options.Authentication.CookieSlidingExpiration = true;
})
这将把cookie的过期时间设置为一年后。但是,在Chrome开发者工具中的应用程序标签下的cookies中,我看到它仍然有一个1969年过期的默认日期。
我下载了IdentityServer4项目源代码,删除了nuget包,并将源代码添加到我的解决方案中,以便我可以调试它。
我看到它在ConfigureInternalCookieOptions.cs / Configure()方法中获得了我给它的过期时间。它也匹配了DefaultCookieAuthenticationScheme内部/应用属性。我没有找到任何特定于IdentityServer的内容会忽略我设置的过期日期,但它仍然有1969年的过期时间。
编辑:我尝试在IdentityServer主机的AccountController中设置cookie持久性,如下所示(有趣的是,Microsoft在此处有一篇关于使用authenticationproperties而不使用AspNet Identity的好文章:https://learn.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”两个Cookie仍保持着1969年的到期时间。