我正在将Identity Server 4与快速入门UI一起使用。
假设我在user A
上有machine A
,他目前是通过浏览器登录的。然后,user A
决定继续执行machine B
并登录到该C0。按现状,将在machine B
和machine A
上为用户A发出新的会话cookie。
这很好,但是我希望该选项用标记来标记特定的用户,例如IsConcurrent
,如果将其设置为true
,则可以选择在machine A
上保留其现有会话,或者终止该会话并在machine B
上启动新会话。
我已经做过一些阅读,发现参考文献here为用户更新安全标记并将时间间隔设置为零,因此它会针对存储版本检查cookie中的安全标记。但是,此代码似乎与Identity Server的代码不一致。另外,在这种情况下,它是否有效?
我也发现了here,其中提到了存储和检查会话ID的值,但是我不确定这是否有效?
最初的想法是实现一些获取机器ID并将其与用户一起存储在表中的中间件,但是后来我不确定如何进一步采用这种方法。
任何帮助或建议都将不胜感激。
假设基于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表单发布后,您可以在会话管理器中标记哪些会话处于活动状态。如果应保留旧会话,则忽略旧会话(保持活动状态),并将当前会话标记为活动状态。
请确保在验证用户身份后添加中间件。
请注意,对于访问令牌,您将需要其他策略。