【问题标题】:IdentityServer4 how to set server cookie expirationIdentityServer4如何设置服务器cookie过期
【发布时间】:2018-03-19 15:51:06
【问题描述】:

到目前为止,我已经了解了如何为客户端 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 开发人员工具中,Cookie 中,我看到它仍然有一个 1969 年的过期默认日期。

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

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

编辑:我尝试将 cookie 设置在 IdentityServer 主机的 AccountController 中,如下所示(有趣的是,Microsoft 有一篇关于在不使用 AspNet Identity 的情况下使用身份验证属性的好文章: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。

【问题讨论】:

  • 您真的找到了解决方案吗?我也有同样的经历......
  • 解决了这个问题(至少在我的情况下)——您使用的是他们的示例“快速入门”UI 登录页面吗?
  • @JakeJ 你是如何获得 id_token 的?

标签: cookies identityserver4


【解决方案1】:

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

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

注意:您还需要在用户登录时指出 cookie 应该是持久的。如果您使用的是 Quickstart UI,那么您必须在登录屏幕上勾选“记住我”复选框以获得持久的曲奇饼。或者您可以修改代码以始终发出持久性 cookie - 像这样:

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

【讨论】:

  • 我已经做到了,这就是我现在所看到的: options.Authentication.CookieLifetime = new TimeSpan(364, 0, 0, 0);但是当我在 Chrome 中打开开发者工具时,“idsrv”cookie 的到期日期仍然设置为 1969 年。
  • 我想知道 AddIdentityServer 附带的 .AddOpenIdConnect() 代码块是否覆盖了它的过期时间?
  • 实际上有两个 cookie,idsrv.session 和 idsrv,但它们的过期日期仍然是 1969。
  • 我正在通过 IdentityServer4 源进行调试,因为它正在接受选项。我看到它看到我正在给它到期。现在,出来的 cookie 仍然已经过期/基于浏览器会话(对于“idsrv”cookie)。我觉得我最终会提交一个拉取请求并发现他们是故意这样做的。它对你有用吗?
  • 有趣。您的登录代码是什么样的?用户登录时是否使 cookie 持久化?
【解决方案2】:

我使用以下代码设置 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;
 });

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-12-26
    • 1970-01-01
    • 2018-10-02
    • 2019-05-23
    • 2017-02-20
    • 2020-04-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多