到目前为止,我已经看到如何为客户端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年到期。
答案 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;
});