首页 > 解决方案 > 无法使用 endsession API 从身份服务中注销

问题描述

我正在执行 GET 到

GET https://localhost:44301/connect/endsession?id_token_hint=eyJhbGciO...GzHCPw

正如EndSession 端点的文档中所建议的那样。

它似乎(在某种程度上)有效,因为我在重定向到的方法中遇到了断点。

[HttpGet("logout")]
public async Task<IActionResult> LogOut(
    [FromQuery] string id_token_hint,
    [FromQuery] string post_logout_redirect_uri,
    [FromQuery] string session,
    [FromQuery] string logoutId)
{ 
  LogoutRequest context = await InteractionService
    .GetLogoutContextAsync(logoutId);
  ...
}

在这里,我得到了一个值logoutId(除非我跳过传递身份令牌,结果 i null),而其他变量没有设置,保持为null. 起初,我很高兴看到事实context并非如此null。然而,我很快就知道它的设置很差,尽管遵循了一些有效的方法

我可以看到客户的姓名和 ID(这似乎是正确的)。但是,除了包含零个元素null的数组之外,其他所有内容都除外。Parameters

我确保传递身份令牌,而不是访问令牌。我还尝试了带有文档中描述的所有参数的完整版本(尝试在我的配置和其他配置中提到的各种重定向 URL)。然而,同样的(错误)行为随之而来。

GET https://localhost:44301/connect/endsession
?id_token_hint=eyJhbGciO...GzHCPw
&post_logout_redirect_uri=https://get_the_duck.off
&session=1337

由于我得到了突破性的打击并获得logoutId了交互服务可解析的一些价值,我觉得它连接正确(这是预期的,因为这样的安全性按预期工作)。但是,我的应用程序似乎是一个跟踪者,只是不会让他们离开,可以这么说。我怀疑,文档没有提到一些微小的细节(或者在我不理解的公式中模糊了)。(谷歌搜索没有给出任何我认为相关的内容。)

努力证明(以及一堆关于安全性的博客,并非专门针对注销)。

标签: c#asp.net-identityidentityserver4asp.net-core-3.1

解决方案


如果您查看官方快速入门,您可以看到他们建议将 initial Get,然后是Post中间的可选提示符组合在一起。最后的Post方法实现通过调用

await HttpContext.SignOutAsync();

推荐阅读