【问题标题】:IdentityServer4 forced logoutIdentityServer4 强制注销
【发布时间】:2020-06-12 17:54:57
【问题描述】:

如何从不同用户的会话从外部触发用户(完全)注销?

例如 - “管理员”登录并注销用户“JohnDoe”(来自 IdentityServer 和所有客户端)。

IdentityServer 支持在用户注销时通知客户端(通过前或后通道)。这很好,但是如何从用户会话之外开始滚动呢?

【问题讨论】:

  • 你能解释一下你为什么想要这个功能吗?管理员这样做的原因是什么?
  • 出于同样的原因,您希望撤销引用或刷新令牌。

标签: identityserver4


【解决方案1】:

令牌的问题是您无法删除令牌,您必须通过将其从商店中删除来撤销它,这样它就不能再使用了。实际上,使用反向通道注销您也有同样的问题。无法直接删除 cookie,但客户端可以在下一次请求时拒绝它。

通过用户会话,反向通道注销可以从 IdentityServer 网站上可用的 cookie 中读取会话信息。但是,管理员无权访问此信息,因此您需要在服务器端存储用户会话。

这可以在客户端或 IdentityServer 上。我会在客户端实现一个会话管理器,因为它是客户端验证 cookie 并可以删除 cookie(在下一个请求中)。

这允许 IdentityServer 执行正常的反向通道注销并将其留给客户端从LogoutCallback 上的会话管理器中删除一个或所有条目。这样您就可以针对不同的客户实施不同的策略。

客户端可以咨询会话管理器以验证 cookie 并在会话不可用时拒绝访问。比如:

public class CookieEventHandler : CookieAuthenticationEvents
{
    private SessionManager _sessionManager { get; }

    public CookieEventHandler(SessionManager sessionManager)
    {
        _sessionManager = sessionManager;
    }

    public override async Task ValidatePrincipal(CookieValidatePrincipalContext context)
    {
        if (context.Principal.Identity.IsAuthenticated)
        {
            var sub = context.Principal.FindFirst("sub")?.Value;

            if (!_sessionManager.HasSession(sub))
            {
                context.RejectPrincipal();
                await context.HttpContext.SignOutAsync(CookieAuthenticationDefaults.AuthenticationScheme);
            }
        }
    }
}

在启动中:

services
    .AddAuthentication(options =>
    {
        options.DefaultScheme = "Cookies";
        options.DefaultChallengeScheme = "oidc";
    })
    .AddCookie("Cookies", options =>
    {
        options.EventsType = typeof(CookieEventHandler);
    })

【讨论】:

  • 谢谢。但是,您的答案似乎更多是关于“客户端应如何实现反向通道注销”,而不是“管理员用户如何强制其他人注销”。除了“但是,管理员无权访问此信息,因此您需要在服务器端存储用户会话”。部分。
  • 因为流程可以大同小异,唯一不同的是用户会话信息的来源。因此,您需要创建一个可由管理员调用的类似方法。当管理员想要为另一个用户执行常规注销时,请解析该用户的子用户并通知客户端(新的反向通道方法)。如上所述,当您让客户端跟踪会话时,您可以轻松地从会话管理器中删除会话(使用 sub),并在下一个请求中删除 cookie。管理员选择用户的方式和位置由您决定。
  • 这是否回答了您的问题,或者您能否解释一下您在我的回答中遗漏了什么?
  • 客户端可以在不同的浏览器甚至不同的机器上。在我看来,真相的来源只能是服务器。客户端的职责是为注销用户提供一个后台通道。而已。就服务器而言,客户端将如何处理它是无关紧要的。因此,如果用户的会话存储在服务器端,那么理论上我可以看到管理员如何枚举它们、生成注销令牌并调用注册的反向通道 URL。
  • 为了确保我们谈论的是同一件事,对于客户端,我的意思是客户端应用程序,如 mvc 客户端(服务器端)。您可以在 IdentityServer 上跟踪会话,但就像您说的那样,IdentityServer 只需发出用户已注销的信号,然后将其留给客户端进行相应的操作。问题是在哪里选择要注销的用户。但事实上,如果您有一个端点可供管理员用来触发用户的反向通道注销,这并不重要。
猜你喜欢
  • 2018-08-13
  • 2016-11-12
  • 2011-12-03
  • 1970-01-01
  • 2021-01-17
  • 1970-01-01
  • 2021-05-09
  • 2021-01-02
  • 1970-01-01
相关资源
最近更新 更多