identityserver4 - Identity Server 4 - 如何解决客户端注销后访问令牌仍然有效?
问题描述
我们正在尝试将 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,特定令牌不再有效?
解决方案
没有任何方法可以撤销访问令牌。您可以使用具有不同流程的 Reference-Token 代替,您可以撤销它。这也是你应该生成生命周期短的访问令牌的原因。当您使用 https 连接时,没有任何方法可以在中途窃取 Access-Token。
推荐阅读
- javascript - 如何解密响应以将其转换为邮递员的对象?
- woocommerce - 查看空购物车 WooCommerce
- javascript - 带有输入类型范围问题的 Sweet alert 2 模态
- javascript - 使用带有引导选项卡的 Muuri Javascript 库 - 除非调整页面大小,否则不会展开?
- java - Java:键-键-值结构的内存高效存储-嵌套映射/键-值对
- ffmpeg - 运行时错误:中止(OOM)。使用 -s ASSERTIONS=1 构建以获取更多信息
- python - 给定地址的本地日期时间
- php - 即使值确实存在,in_array() 也不起作用
- android - 将 build compileSdkVersion 升级到 30 后无法确定是否安装了应用
- python - Python-我需要我的程序来计算掷出 2 个骰子的每个结果发生了多少次。(2-12 是可能的结果)