如何处理客户端应用程序和Identityserver4之间的空闲会话超时

时间:2019-07-15 03:22:11

标签: asp.net asp.net-core single-sign-on identityserver4 user-inactivity

我陷入困境,需要一些建议或解决方案的指针。对于单一实施,我有一个非常简单的IdentityServer4设置。

三个应用

具有asp.net核心身份的IDServer(ID服务器)

ASP.NET Core 2.2 MVC(client1)

ASP.NET Core 2.2 MVC(client2) 使用混合授权设置MVC客户端

两种情况:

  1. 如果用户在任何一个客户端中都处于活动状态(例如client1),则在该应用(client2)中达到空闲超时后,不应在client2中注销该用户。
  2. 如果用户在两个客户端(client1和client2)中均处于非活动状态,则当空闲超时超过时,系统应从所有客户端(client1和client2)中注销该用户。

方案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;
            })

2 个答案:

答案 0 :(得分:1)

我们采用的方法以及我认为符合OIDC规范精神的方法是IDP会话是主会话,可以长期存在。 IDP不在乎客户端会话,但是客户端应该监视IDP会话(会话监视规范),并且在IDP退出时,客户端会话也应该退出(前通道或后通道)。从客户端显式退出还应该退出IDP会话。

此外,由于协议支持prompt=loginmax_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注销,您可能会找到可以使用的示例。