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

Entra B2C到Blazor应用SLO问题:.NET 4.8登出后Blazor仍认证

解决方案:Entra B2C单点登出(SLO)在Blazor InteractiveAuto应用中失效问题

结论:需要自定义SLO URL

默认的MicrosoftIdentity/Account/SignOut端点无法正确处理Entra B2C通过iframe发起的SLO回调,因为它没有同步清理Blazor客户端的本地令牌存储,也没有强制触发页面刷新后的重新认证逻辑。自定义SLO端点需要同时处理服务器端会话清理和客户端认证状态清除,才能实现刷新后需重新登录的效果。


自定义SLO端点需执行的核心操作

1. 创建自定义登出端点页面

在Blazor应用中添加一个Razor页面(如CustomSignOut.razor),用于处理Entra的SLO回调:

@page "/CustomSignOut"
@inject NavigationManager NavManager
@inject IHttpContextAccessor HttpContextAccessor
@inject IJSRuntime JS

@code {
    protected override async Task OnInitializedAsync()
    {
        // 1. 清理服务器端认证会话
        if (HttpContextAccessor.HttpContext != null)
        {
            // 登出Cookie认证方案
            await HttpContextAccessor.HttpContext.SignOutAsync(CookieAuthenticationDefaults.AuthenticationScheme);
            // 登出OpenID Connect方案
            await HttpContextAccessor.HttpContext.SignOutAsync(OpenIdConnectDefaults.AuthenticationScheme);
        }

        // 2. 清理客户端MSAL令牌存储
        await JS.InvokeVoidAsync("clearMsalAuthStorage");

        // 3. 强制跳转登录页并刷新,触发重新认证
        NavManager.NavigateTo("/login", forceLoad: true);
    }
}

2. 添加客户端存储清理脚本

在wwwroot/js/custom-auth.js中添加清理MSAL本地存储的逻辑:

function clearMsalAuthStorage() {
    // 清除所有MSAL相关的本地存储项
    Object.keys(localStorage).forEach(key => {
        if (key.startsWith('msal.')) localStorage.removeItem(key);
    });
    Object.keys(sessionStorage).forEach(key => {
        if (key.startsWith('msal.')) sessionStorage.removeItem(key);
    });
}

并在_Layout.cshtml或index.html中引用该脚本:

<script src="js/custom-auth.js"></script>

3. 配置Entra B2C应用注册的前端通道登出URL

在Entra B2C的应用注册页面中,进入认证 > 前端通道登出,将登出URL修改为自定义端点:https://myapp.com/CustomSignOut,并确保勾选"允许所有域"或指定你的应用域名。

4. 验证效果

完成配置后,从.NET 4.8应用发起登出操作,再刷新Blazor应用标签页,此时会自动跳转到登录页,实现了"刷新后需重新登录"的核心需求。


为什么默认端点失效?

Entra B2C的SLO是通过iframe静默调用前端通道登出URL的,而默认的MicrosoftIdentity/Account/SignOut主要处理用户主动跳转的场景:

  • 它不会主动清理Blazor客户端的MSAL本地令牌存储
  • 静默iframe场景下无法触发Blazor的客户端认证状态更新
  • 没有强制触发页面刷新后的重新认证流程

自定义端点通过同时处理服务器端会话和客户端存储,解决了iframe静默回调的局限性。

内容的提问来源于stack exchange,提问作者Josh

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.14 12:28:11