Identity Server 4 - 如何解决客户端注销后访问令牌仍然有效?

Posted

技术标签:

【中文标题】Identity Server 4 - 如何解决客户端注销后访问令牌仍然有效?【英文标题】:Identity Server 4 - how to solve Access Token still valid after client Logout? 【发布时间】:2020-06-13 09:02:43 【问题描述】:

我们正在尝试将 Identity Server 4 (IDSV4) 与我们的 Mvc 客户端和 WebApi2 客户端集成。

我们发现,访问令牌仍然有效,即使在用户从客户端和 IDSV4 注销后,仍可用于使用来自 WebApi2 的服务。

我不知道如何在用户退出后立即强制它变为无效。

以下是重现此行为的步骤:

    打开 Mvc 客户端并登录 IDSV4 使用await HttpContext.GetTokenAsync(OpenIdConnectParameterNames.AccessToken) 获取访问令牌

    复制 AccessToken 并使用该令牌访问 WebApi2(它有效,我们可以看到 Api 和 IDSV4 之间的验证步骤)

    我使用以下方法从 IDSV4 和客户端注销:

    等待 HttpContext.SignOutAsync("Cookies"); 等待 HttpContext.SignOutAsync("oidc");

    如果我们在 Mvc Client 上刷新网页,我们可以看到用户已经退出。

    重复Step3,使用相同的AccessToken再次向WebApi2发送请求。它仍然有效,因为它不再进行令牌验证。

IMO,这是一个安全问题,因为我们在 AJAX 调用中使用该访问令牌,如果用户使用浏览器工具并且即使在注销后重复相同的请求,用户也可以看到该令牌。

这是将我的 WebApi2 与 IDSV4 集成的代码:

services.AddAuthentication(

            IdentityServerAuthenticationDefaults.AuthenticationScheme)
            .AddIdentityServerAuthentication(options =>
            
                options.Authority = "http://idsv.url";
                options.ApiName = "api1";
            );

我尝试将 options.CacheDuration 设置为零,但仍然是相同的行为。

您能否建议我如何防止它或在用户注销时强制我的 Api 重新验证?是否有通知 Api 特定令牌不再有效?

【问题讨论】:

这通常是设计使然。 cookie/token 的过期时间是多少?它应该是短暂的。 【参考方案1】:

没有任何方法可以撤销访问令牌。您可以使用具有不同流程的 Reference-Token 代替,您可以撤销它。这也是你应该生成生命周期短的访问令牌的原因。 当你使用 https 连接时,没有任何方法可以中途窃取 Access-Token。

【讨论】:

+1 用于参考标记。只需将 API 的缓存时间(令牌内容)设置为与您当前的访问令牌生命周期相同,行为基本相同,而且现在您可以随时在服务器端撤销它们,无论是在正常的事件过程中 - 例如注销 - 或者如果有人受到损害。此外,它们在 Authorization 标头中通常要小得多。 如何从受保护的资源中撤销引用令牌,而不是针对给定用户,而是针对任何用户? 通过使用 RevocationTokenEndpoint -> identityserver4.readthedocs.io/en/latest/endpoints/… @TTCG 是的,但是如何从数据库中获取给定用户的撤销令牌?它们不是直接存储的,而是存储它们的 SHA512/256 哈希?

以上是关于Identity Server 4 - 如何解决客户端注销后访问令牌仍然有效?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 Identity Server 4 (JWT) 进行基于角色的 Web API 授权

Identity Server 4 没有可用于令牌的安全令牌验证器

使用Identity Server 4建立Authorization Server

如何在 Identity Server 4 中使用主域进行 Openid 身份验证?

Identity Server 4 - Hybrid Flow - 保护API资源

Identity Server 4 原理和实战(完结)_Authorization Code Flow 实例