You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用OpenID的应用AD登出正常但B2C登出卡住问题咨询

问题原因

  • 默认SignOutResult适配普通AD登出没有问题,但Azure AD B2C的OpenID Connect登出流程存在两个特殊要求,是你当前代码没有覆盖的:
    1. B2C要求登出请求必须携带备案过的post_logout_redirect_uri,该地址需要提前在对应B2C用户流/自定义策略的「登出重定向URI」列表中添加,否则B2C不会回调应用的signout-oidc地址,就会出现跳转后无响应的情况。
    2. B2C登出请求必须携带对应的策略名参数,默认的OIDC中间件登出逻辑如果没有提前配置该参数,会导致请求缺失必填字段,无法触发后续跳转流程。

解决方法

你不是必须硬编码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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.29 07:15:05