为什么我的基于IdentityServer4的服务器在30分钟内超时,并且只在前30分钟内支持SSO?

时间:2018-04-06 23:29:09

标签: core identityserver4 session-timeout

我有一个基于IdentityServer4和.NET Core 2.0开发的应用程序系统。就在最近,我注意到无论用户活动如何,登录服务器都会在30分钟内超时。在30分钟边界之后,客户端应用程序无法启动其他启用SSO的应用程序。 30分钟后,启动任何新应用程序将强制用户登录。我查看了可能影响SSO功能的cookie,有三个:AspNetCore.Identity.Application,Identity.External和idsrv.session。但它们都是浏览器会话cookie。我不知道他们会怎么超时。谁知道发生了什么?

我的相关设置:

  • 绝对刷新令牌生命周期:2592000
  • 访问令牌生命周期:3600
  • 授权终身300
  • 身份令牌生命周期:300

3 个答案:

答案 0 :(得分:1)

mode777是对的。此问题与IdentityServer4和OpenID Connect无关。它与AspNetCore.Identity有关。我发现this link非常有帮助,并通过添加如下所示的行来解决我的超时问题:

services.Configure<SecurityStampValidatorOptions>(options => options.ValidationInterval = TimeSpan.FromHours(24));

所以,发生了这样的事情:在30分钟的默认间隔之后,对服务器的请求将通过用户安全标记检查。由于某些未知原因,检查我的用户安全标记的逻辑认为标记无效,因此调用SignInManager的SignOutAsync,它会杀死所有内容。我还不明白的是,我的用户安全标记永远不会改变!它不应该导致失效。现在,我将让我的应用程序使用更长的检查间隔,并将密切关注安全标记。

答案 1 :(得分:1)

通过源代码进行挖掘,我发现原因是身份验证cookie(AspNet.Identity.SecurityStamp)中缺少SecurityStamp声明(默认名称:.AspNetCore.Identity.Application)。 30分钟后(options.ValidationInterval的默认值)将针对商店中的印章验证安全印章。如果cookie中缺少它-验证将立即失败。

因此解决方案是将安全性戳放入cookie。

在我的情况下,问题是由于我使用了错误的登录方法:HttpContext.SignInAsync而不是内置的Asp.Net Identity SignInManager.SignInAsync,在大多数情况下更可取。 SignInManager.SignInAsync将该声明放入Cookie。

答案 2 :(得分:0)

首先,这不是Identity Server 4或OpenID Connect相关问题。这涉及可能由Asp.Net Identity主导的本地登录,这可能是基于Cookie的(这完全取决于您的配置 - Startup.cs会很好)。

您可以为Asp.Net Identity配置会话超时,如下所述:ASP.NET Identity Session Timeout

你试过吗?