【发布时间】:2021-10-23 14:48:16
【问题描述】:
我正在执行一个 GET 到
GET https://localhost:44301/connect/endsession?id_token_hint=eyJhbGciO...GzHCPw
如the docs for EndSession endpoint 建议的那样。
它似乎(在某种程度上)有效,因为我在重定向到的方法中的断点上遇到了问题。
[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 中获得了一个值(除非我跳过传递身份令牌,导致我null),而其他变量未设置,保持为null。起初,我很高兴看到 context 不是 null。然而,我很快就知道它的设置很糟糕,尽管关注了stuff that work。
我可以看到客户的姓名和 ID(这似乎是正确的)。但是,除了数组Parameters 之外,其他所有内容都是null,它包含零个元素。
我确保传入 identity 令牌,而不是 access 令牌。我还尝试了带有所有参数 described in the docs 的完整版本(尝试在我的配置和其他配置中提到的各种重定向 URL)。然而,同样的(错误)行为随之而来。
获取 https://localhost:44301/connect/endsession
?id_token_hint=eyJhbGciO...GzHCPw
&post_logout_redirect_uri=https://get_the_duck.off
&session=1337
由于我得到了突破性的打击并获得了交互服务可解析的logoutId 的一些价值,我觉得它已正确连接(这是预期的,因为这样的安全性按预期工作)。然而,我的应用程序似乎是一个跟踪者,只是不会让他们离开,可以这么说。我怀疑,文档没有提到一些微小的细节(或者在我不理解的公式中模糊了)。 (谷歌搜索没有给出任何我认为相关的内容。)
努力证明(包括一堆关于安全性的博客,并非专门针对注销)。
【问题讨论】:
-
您是将用户的浏览器重定向到该 URL 还是以其他方式调用它?
-
@mackie 用户的浏览器对问题中的端点执行 GET 请求,提供 ID 令牌。然后,IDS4 通过反向通道将调用路由到我的安全控制器(仍然使用 IDP)的方法,将
logoutId传递给我,我在交互服务中将其用于GetLogoutContextAsync(logoutId)。这样,我获得了一个注销上下文。但是,该上下文似乎缺少数据(客户端的 ID 除外,这是正确的)。 -
@mackie 我试过
SingOutAsync(scheme),其中方案是一堆不同的选项:Identity.Application、idsrv、idsrv.exernal和其他一些选项。但是,令牌可以重新用于访问,并且用户似乎没有退出。如果注销上下文中没有任何引用用户 GUID 的内容,那么哪种方法有意义。 -
当您说“令牌”时,您是指颁发给客户端应用程序的访问令牌吗?退出不会撤销任何访问令牌,因为它们本质上不能被撤销。如果您创建逻辑来执行此操作或显式使用客户端应用程序中的撤销端点,则可以清除刷新令牌/引用令牌。如果您指的是 auth cookie,则删除不受后端支持的 cookie 不会使其值无效,因此如果有人设法复制它,它仍然可以重复使用。
-
@mackie 抱歉不准确。我的意思是 在
SignOutAsync(...)执行之后,两个 cookie(名为 idsrv.session 和 .AspNetCore.Identity:application)还在那里。当我调用SignInAsync(...)时会出现这些,并且我希望当我注销用户时它们会消失。浏览器中的令牌会被 Angular 应用程序删除,但是当它调用 /connect/authorize 时,会在不传递任何凭据的情况下发出一个新令牌。如果我手动删除 cookie,则会在发出任何令牌之前请求凭据。我断定用户没有退出。
标签: c# asp.net-identity identityserver4 asp.net-core-3.1