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