停止用户同时通过不同的计算机登录-Identity Server 4

问题描述 投票:0回答:1

我正在将Identity Server 4与快速入门UI一起使用。

假设我在user A上有machine A,他目前是通过浏览器登录的。然后,user A决定继续执行machine B并登录到该C0。按现状,将在machine Bmachine A上为用户A发出新的会话cookie。

这很好,但是我希望该选项用标记来标记特定的用户,例如IsConcurrent,如果将其设置为true,则可以选择在machine A上保留其现有会话,或者终止该会话并在machine B上启动新会话。

我已经做过一些阅读,发现参考文献here为用户更新安全标记并将时间间隔设置为零,因此它会针对存储版本检查cookie中的安全标记。但是,此代码似乎与Identity Server的代码不一致。另外,在这种情况下,它是否有效?

我也发现了here,其中提到了存储和检查会话ID的值,但是我不确定这是否有效?

最初的想法是实现一些获取机器ID并将其与用户一起存储在表中的中间件,但是后来我不确定如何进一步采用这种方法。

任何帮助或建议都将不胜感激。

c# asp.net-identity identityserver4
1个回答
0
投票

假设基于cookie的身份验证,您可以扩展client以验证用户会话,只要客户端跟踪用户会话。

为此,您可以创建一个会话管理器,在其中登录后为用户(子)添加会话,其中还包括自动登录会话(SSO)。在注销时删除一个或所有会话,也应在后通道注销(LogoutCallback)上更新该会话。

假设您使用中间件,您可以在那儿咨询会话管理器并决定要做什么。登录后,请确保当前会话尚未激活。它必须至少经历一次中间件。一些伪代码来说明这个想法:

public Task Invoke(HttpContext context, SessionManager sessionManager)
{
    if (context.Principal.Identity.IsAuthenticated)
    {
        var sub = context.Principal.FindFirst("sub")?.Value;
        var sid = context.Principal.FindFirst("sid")?.Value;

        // User is allowed when the current session is active.
        if (!sessionManager.CurrentSessionIsActive(sub, sid))
        {
            // Rewrite path if user needs and is allowed to choose: redirect to session selector or
            // Activate the current session and deactivate other sessions, if any.
            if (sessionManager.HasMultipleSessions(sub) && sessionManager.CanSelectSession(sub))
                context.Request.Path = new PathString("/SelectSession");
            else
                sessionManager.ActivateCurrentSession(sub, sid);
        }
    }
    return _next(context);
}

在SelectSession表单发布后,您可以在会话管理器中标记哪些会话处于活动状态。如果应保留旧会话,则忽略旧会话(保持活动状态),并将当前会话标记为活动状态。

请确保在验证用户身份后添加中间件。

请注意,对于访问令牌,您将需要其他策略。

© www.soinside.com 2019 - 2024. All rights reserved.