IdentityServer4强制注销

IdentityServer4强制注销,identityserver4,Identityserver4,如何从不同用户的会话外部触发用户(完全)注销 例如,“管理员”登录并注销用户“JohnDoe”(来自IdentityServer和所有客户端) IdentityServer支持在用户注销时通知客户端(通过前端或后端通道)。这很好,但是如何从用户会话之外开始滚动呢 令牌的问题是您不能删除令牌,您必须通过从存储中删除它来撤销它,这样它就不能再使用了。事实上,使用反向通道注销时,您也会遇到同样的问题。您不能直接删除cookie,但客户端可以在下一个请求中拒绝它 通过用户会话,后台注销可以从Identi

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

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


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

令牌的问题是您不能删除令牌,您必须通过从存储中删除它来撤销它,这样它就不能再使用了。事实上,使用反向通道注销时,您也会遇到同样的问题。您不能直接删除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只需发出用户已注销的信号,然后将其留给客户端进行相应的操作。问题是在哪里选择要注销的用户。但事实上,如果您有一个端点,管理员可以使用该端点触发用户的反向通道注销,这并不重要。