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