使用OpenID的应用AD登出正常但B2C登出卡住问题咨询
问题原因
- 默认
SignOutResult适配普通AD登出没有问题,但Azure AD B2C的OpenID Connect登出流程存在两个特殊要求,是你当前代码没有覆盖的:- B2C要求登出请求必须携带备案过的
post_logout_redirect_uri,该地址需要提前在对应B2C用户流/自定义策略的「登出重定向URI」列表中添加,否则B2C不会回调应用的signout-oidc地址,就会出现跳转后无响应的情况。 - B2C登出请求必须携带对应的策略名参数,默认的OIDC中间件登出逻辑如果没有提前配置该参数,会导致请求缺失必填字段,无法触发后续跳转流程。
- B2C要求登出请求必须携带备案过的
解决方法
你不是必须硬编码B2C的登出端点,两种方案都可以解决问题:
方案一:调整现有登出逻辑适配B2C
首先在AddOpenIdConnect配置块中提前配置B2C相关的登出参数,指定SignedOutCallbackPath和PostLogoutRedirectUri,确保和B2C侧备案的地址一致。之后调整登出代码:
[Authorize] public async Task<IActionResult> LogoutAsync() { var scheme = User.Claims.FirstOrDefault(c => c.Type == ".AuthScheme")?.Value; if (string.IsNullOrEmpty(scheme)) { return RedirectToAction("Index"); } // B2C场景单独传认证属性 if (scheme.Equals("B2C", StringComparison.OrdinalIgnoreCase)) { var authProperties = new AuthenticationProperties { RedirectUri = "/", Items = { { "policy", "你的B2C对应策略名称,比如B2C_1_signin" } } }; return SignOut(authProperties, CookieAuthenticationDefaults.AuthenticationScheme, scheme); } // AD场景保持原有逻辑 return SignOut(CookieAuthenticationDefaults.AuthenticationScheme, scheme); }
方案二:直接使用B2C官方登出端点
如果你不想调整现有认证配置,可以直接拼接你提到的登出端点,需要注意两点:
- 拼接的
post_logout_redirect_uri必须已经在B2C对应策略的登出重定向列表中配置完成,且需要做URL编码。 - 调用该端点前需要先清空本地的Cookie认证信息,避免本地会话残留。
补充说明:如果启用了B2C单点登录,必须调用B2C的登出端点才能彻底清空B2C侧的会话,仅清理本地Cookie无法完成完整登出。
内容的提问来源于stack exchange,提问作者Dave
相关产品推荐
相关产品推荐

