从外部提供者注销后,身份服务器登录流程卡住

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 注销请求应该允许匿名请求。

【讨论】:

以上是关于从外部提供者注销后,身份服务器登录流程卡住的主要内容,如果未能解决你的问题,请参考以下文章

Keycloak集成三方身份提供者的注销流程

令牌持有者身份验证 - 不活动时间后注销

身份提供商(salesforce)注销SSO时注销服务提供商(passport-saml)

提供者登录注销颤动

IdentityServer4-主题

OWIN openid连接外部登录不执行指定的回调url