从外部提供者注销后,身份服务器登录流程卡住
Posted
技术标签:
【中文标题】从外部提供者注销后,身份服务器登录流程卡住【英文标题】:Identity Server login flow stuck after Login out from External Provider 【发布时间】:2021-07-11 06:28:45 【问题描述】:我正在使用 Identity Server 4,版本 3.1.1,当 WS-Federation 用于外部提供程序时,我在从 SPA 客户端注销后出现了奇怪的行为。我目前正在使用 ADFS 作为外部提供程序,它是按照本指南进行配置的:https://docs.microsoft.com/en-us/aspnet/core/security/authentication/ws-federation?view=aspnetcore-3.1
详情
当用户注销时,会发生以下情况: 外部提供者的注销受到挑战 -> ADFS 执行注销 -> 重定向到 Identity Server /Account/Logout?logoutId=logout-id -> Identity Server 重定向到 /Account/Login?ReturnUrl=/Account/Logout?logoutId =logout-id (为清楚起见未使用编码的 url) 之后,每次登录都会将用户重定向回 ADFS 进行登录,并且在登录 ADFS 后,用户以 URL /Account/Login?ReturnUrl=/Account/Logout?logoutId=logout-id
结尾问题 我遵循了请求重定向,他们让我访问 AccountController (QuickstartUI) 上的以下代码
225 [HttpPost]
226 [ValidateAntiForgeryToken]
227 public async Task<IActionResult> Logout(LogoutInputModel model)
228
229 // build a model so the logged out page knows what to display
230 var vm = await BuildLoggedOutViewModelAsync(model.LogoutId);
231
232 if (User?.Identity.IsAuthenticated == true)
233
234 // delete local authentication cookie
235 await _signInManager.SignOutAsync();
236
237 // raise the logout event
238 await _events.RaiseAsync(new UserLogoutSuccessEvent(User.GetSubjectId(), User.GetDisplayName()));
239
240
241 // check if we need to trigger sign-out at an upstream identity provider
242 if (vm.TriggerExternalSignout)
243
244 // build a return URL so the upstream provider will redirect back
245 // to us after the user has logged out. this allows us to then
246 // complete our single sign-out processing.
247 string url = Url.Action("Logout", new logoutId = vm.LogoutId );
248
249 // this triggers a redirect to the external provider for sign-out
250 return SignOut(new AuthenticationProperties RedirectUri = url , vm.ExternalAuthenticationScheme);
251
252
253 return View("LoggedOut", vm);
254
当用户注销时,到达第 250 行并使用指向 /Account/Logout?logoutId=logout-id 的重定向 url 调用外部提供商的注销,但是当该请求到达时,用户是已经从 Identity Server 注销,显然是因为在重定向到 ADFS 之前在第 235 行调用了注销,因此,在处理该重定向时身份验证受到质疑,并且用户被重定向到 /Login 页面。
我需要进行哪些不同的配置才能正确处理最后一次重定向?我想这不是 Identity Server 的错误,但这意味着注销流程不会像我预期的那样工作,那么这个注销流程将如何工作? 我在 github 上发布了一个类似的问题,但目前没有答案:https://github.com/IdentityServer/IdentityServer4/issues/5204
提前致谢
【问题讨论】:
【参考方案1】:GET 注销请求应该允许匿名请求。
【讨论】:
以上是关于从外部提供者注销后,身份服务器登录流程卡住的主要内容,如果未能解决你的问题,请参考以下文章