我陷入困境,需要一些建议或解决方案的指针。对于单一实施,我有一个非常简单的IdentityServer4设置。
三个应用
具有asp.net核心身份的IDServer(ID服务器)
ASP.NET Core 2.2 MVC(client1)
ASP.NET Core 2.2 MVC(client2) 使用混合授权设置MVC客户端
两种情况:
方案1:用户在任何一个客户端中处于活动状态。 用户在client1中处于活动状态,而在client2中处于空闲状态 预期行为: 当空闲超时超过时,系统不应从client2注销。 当前身份行为: 可以继续在client1中工作,但是在空闲时间超过后,client2和ID服务器将导航到登录页面。
方案2: 用户在所有2个客户端(client1和client2)中均处于非活动状态 预期行为: 当空闲超时超过时,系统应从所有2个客户端和ID服务器中注销用户。
如果我仅在ID服务器中设置cookie过期时间(已删除滑动有效期为true,并且client1和client2中的cookie过期时间),则即使两个客户端都空闲直到ID服务器过期,客户端应用程序仍可连续工作而没有过期时间超过此值,客户端应用程序将持续工作。
我想知道是否可以实现预期的行为
客户:
.AddCookie(options =>
{
// Configure the client application to use sliding sessions
options.SlidingExpiration = true;
// Expire the session of 15 minutes of inactivity
options.ExpireTimeSpan = TimeSpan.FromMinutes(15);
})
ID服务器:
services.AddIdentityServer(options =>
{
options.Authentication.CookieLifetime = TimeSpan.FromMinutes(15);
options.Authentication.CookieSlidingExpiration = true;
})
答案 0 :(得分:1)
我们采用的方法以及我认为符合OIDC规范精神的方法是IDP会话是主会话,可以长期存在。 IDP不在乎客户端会话,但是客户端应该监视IDP会话(会话监视规范),并且在IDP退出时,客户端会话也应该退出(前通道或后通道)。从客户端显式退出还应该退出IDP会话。
此外,由于协议支持prompt=login
和max_age=n
,因此即使IDP上已经存在活动会话,您也可以强制执行交互式身份验证。这使客户端可以实施自己的用户身份验证频率策略,例如要访问管理功能,您必须在最近5分钟之内通过身份验证。
如果IDP auth cookie过期时启动了会话监视,但开箱即用,则IDS4不会发生。但是,应该可以创建一个自定义IUserSession实现,该实现将会话ID cookie与主身份验证cookie正确对齐。
答案 1 :(得分:0)
首先需要回答的问题是:什么系统,在哪里?
浏览器客户端不可信任,也不应干涉。我认为最好恢复cookie设置。不要让前台尝试触发注销。
最好在后端跟踪用户。您可以通过在Mvc客户端中添加以下服务来实现此目的:1.将用户注册为IdentityServer的活动用户; 2.跟踪活动; 3.当用户似乎不活动的时间过长时,通过IdentityServer取消注册用户。看一下IdentityServer附带的token cleanup服务,以启发您如何使用间隔更新列表。
在两个Mvc客户端启动时,为cookie添加处理程序:
Services
.AddAuthentication(options =>
{
options.DefaultScheme = "Cookies";
options.DefaultChallengeScheme = "oidc";
})
.AddCookie("Cookies", options =>
{
// you'll need to create your own handler
options.EventsType = typeof(MyCookieEventHandler);
})
我不会在此处添加代码,而是说明其目的:每次用户需要访问安全源时都会调用cookiehandler。这意味着您可以在此处更新用户活动时间戳记(用于跟踪用户),这意味着您不必一直联系IdentityServer。该服务仅在状态发生变化时才与IdentityServer联系:用户已变为活动状态或非活动状态。
现在,您需要向IdentityServer添加服务,以便在中央位置跟踪用户。您可以在商店中保留用户的状态。在用户处于活动状态时(每个客户端)添加一个用户,在不再处于活动状态时删除该用户。从该列表中删除用户的最后一个会话后,触发backchannel logout。
反向通道注销可以向mvc客户端发出信号,表明用户已注销。然后使用CookieEventHandler拒绝用户访问。这不会在注销时更新前端,但是在用户联系mvc客户端时有效。它将发现自己已退出所有应用程序和Identityserver。
当您点击链接时,您将看到CookieEventHandler的实现。并在互联网上搜索 backchannel注销,您可能会找到可以使用的示例。