Identity Server 4 - 如何解决客户端注销后访问令牌仍然有效的问题?
Identity Server 4 - how to solve Access Token still valid after client Logout?
我们正在尝试将 Identity Server 4 (IDSV4) 与我们的 Mvc 客户端和 WebApi2 客户端集成。
我们发现,访问令牌仍然有效并且可以用于使用来自 WebApi2 的服务,即使用户已从两者注销客户端和 IDSV4.
我不知道如何在用户退出后强制它失效。
重现此行为的步骤如下:
- 打开 Mvc 客户端并登录 IDSV4
- 使用
await HttpContext.GetTokenAsync(OpenIdConnectParameterNames.AccessToken)
获取访问令牌
复制 AccessToken 并使用该令牌访问 WebApi2(有效,我们可以看到 Api 和 IDSV4 之间的验证步骤)
我使用以下命令从 IDSV4 和客户端注销:
await HttpContext.SignOutAsync("Cookies");
await HttpContext.SignOutAsync("oidc");
如果我们在Mvc Client上刷新网页,可以看到用户已经退出。
重复步骤 3 并使用相同的 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。
我们正在尝试将 Identity Server 4 (IDSV4) 与我们的 Mvc 客户端和 WebApi2 客户端集成。
我们发现,访问令牌仍然有效并且可以用于使用来自 WebApi2 的服务,即使用户已从两者注销客户端和 IDSV4.
我不知道如何在用户退出后强制它失效。
重现此行为的步骤如下:
- 打开 Mvc 客户端并登录 IDSV4
- 使用
await HttpContext.GetTokenAsync(OpenIdConnectParameterNames.AccessToken)
获取访问令牌
复制 AccessToken 并使用该令牌访问 WebApi2(有效,我们可以看到 Api 和 IDSV4 之间的验证步骤)
我使用以下命令从 IDSV4 和客户端注销:
await HttpContext.SignOutAsync("Cookies"); await HttpContext.SignOutAsync("oidc");
如果我们在Mvc Client上刷新网页,可以看到用户已经退出。
重复步骤 3 并使用相同的 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。