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

Azure AD B2C会话超时自动登出:需应用端实现还是配置自定义策略?

会话超时自动登出:应用端实现为主,策略端配置为辅

这个问题的核心结论是:会话超时后的自动登出逻辑主要需要在你的Blazor SPA应用端实现,Azure AD B2C自定义策略的配置是辅助性的——用来定义会话的有效期规则,但不会主动触发前端的登出跳转。

为什么当前页面不会自动登出?

Azure AD B2C的自定义策略里配置的会话超时(比如SessionExpiryInSeconds)是控制B2C身份服务端的会话有效期,以及单点登录(SSO)的行为。但B2C不会主动向你的Blazor SPA推送会话过期的通知:

  • 当你打开新标签页时,应用会主动发起认证请求(比如尝试获取令牌),此时B2C返回“会话已过期”,所以触发登录流程;
  • 但当前活跃的页面如果没有主动检测令牌状态,就不会知道会话已经过期,自然不会自动跳转。

应用端实现自动登出的具体步骤

你需要借助Blazor常用的认证库(比如Microsoft.Identity.Web)来实现令牌过期的检测和登出逻辑,以下是几种常用方案:

  1. 监听令牌过期事件
    在Program.cs配置认证时,直接监听令牌过期事件,触发登出并跳转:

    builder.Services.AddMsalAuthentication(options =>
    {
        builder.Configuration.Bind("AzureAdB2C", options.ProviderOptions.Authentication);
        // 配置你的API权限范围
        options.ProviderOptions.DefaultAccessTokenScopes.Add("https://yourtenant.onmicrosoft.com/api/access_as_user");
        
        // 监听令牌过期事件
        options.Events.OnTokenExpired = async context =>
        {
            var navManager = context.HttpContext.RequestServices.GetRequiredService<NavigationManager>();
            // 清除本地认证状态
            await context.HttpContext.SignOutAsync("Cookies");
            await context.HttpContext.SignOutAsync("OpenIdConnect");
            // 跳转到登录页
            navManager.NavigateTo("/authentication/login");
        };
    });
    
  2. 定期检测令牌过期时间
    在Blazor组件中定期检查当前用户的令牌过期时间,提前触发登出(避免刚好过期时的请求失败):

    @inject AuthenticationStateProvider AuthStateProvider
    @inject NavigationManager NavManager
    @implements IDisposable
    
    @code {
        private System.Timers.Timer? _expiryTimer;
    
        protected override async Task OnInitializedAsync()
        {
            var authState = await AuthStateProvider.GetAuthenticationStateAsync();
            var user = authState.User;
    
            if (user.Identity.IsAuthenticated)
            {
                var expiresAtClaim = user.FindFirst("exp");
                if (expiresAtClaim != null)
                {
                    var expiresAt = DateTimeOffset.FromUnixTimeSeconds(long.Parse(expiresAtClaim.Value));
                    var timeUntilExpiry = expiresAt - DateTimeOffset.Now;
    
                    // 提前5秒触发登出
                    _expiryTimer = new System.Timers.Timer(timeUntilExpiry.TotalMilliseconds - 5000);
                    _expiryTimer.Elapsed += async (_, __) =>
                    {
                        // 确保在UI线程执行跳转
                        await InvokeAsync(() =>
                        {
                            NavManager.NavigateTo("/authentication/logout");
                        });
                    };
                    _expiryTimer.AutoReset = false;
                    _expiryTimer.Start();
                }
            }
        }
    
        public void Dispose()
        {
            _expiryTimer?.Dispose();
        }
    }
    
  3. 处理静默刷新失败
    如果你的应用配置了令牌静默刷新(默认可能已开启),当静默刷新失败(说明会话确实过期)时,也要触发登出:

    options.Events.OnAuthenticationFailed = async context =>
    {
        if (context.Exception is MsalUiRequiredException)
        {
            // 静默刷新失败,会话已过期,触发登出
            var navManager = context.HttpContext.RequestServices.GetRequiredService<NavigationManager>();
            await context.HttpContext.SignOutAsync("Cookies");
            navManager.NavigateTo("/authentication/login");
        }
    };
    

策略端的辅助配置

虽然核心逻辑在应用端,但你需要确保自定义策略的会话配置符合预期,比如:

  • 在UserJourneyBehaviors中设置SessionExpiryType(Absolute为固定过期,Rolling为活动时续期)和SessionExpiryInSeconds;
  • 确认SingleSignOn的Mode配置(比如SameDevice限制同设备SSO,None禁用SSO)。

示例策略配置片段:

<UserJourneyBehaviors>
  <SingleSignOn Scope="Tenant" KeepAliveInDays="7" />
  <SessionExpiryType>Absolute</SessionExpiryType>
  <SessionExpiryInSeconds>3600</SessionExpiryInSeconds>
</UserJourneyBehaviors>

总结

  • Azure AD B2C自定义策略负责定义会话规则,但不会主动通知前端应用会话过期;
  • 新标签页提示登录是因为应用主动发起了认证请求,而当前页面需要主动检测令牌状态来实现自动登出;
  • 借助Microsoft.Identity.Web的事件监听或定期检查令牌过期时间,就能实现会话超时后的自动登出和跳转。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.04 16:40:52