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

Blazor WebApp 8.0集成AzureADB2C时会话超时功能实现求助

Blazor WebApp 8.0 实现20分钟无活动会话超时(AzureADB2C认证)

一、修正后端认证Cookie配置

Blazor WebApp 8.0(尤其是Auto渲染模式)下,单独调用ConfigureApplicationCookie可能因AzureADB2C的认证方案名称不匹配失效,需在AddAzureADB2C配置中直接绑定Cookie参数:

builder.Services.AddAuthentication(AzureADB2CDefaults.AuthenticationScheme)
    .AddAzureADB2C(options =>
    {
        builder.Configuration.Bind("AzureADB2C", options);

        // 配置会话Cookie核心参数
        options.Cookie.HttpOnly = true;
        options.Cookie.SecurePolicy = CookieSecurePolicy.Always;
        options.Cookie.SameSite = SameSiteMode.Lax;
        options.Cookie.Expiration = TimeSpan.FromMinutes(20);
        // 无活动时自动刷新超时时间
        options.UseSlidingExpiration = true;
    });

// 配置角色授权策略(根据你的业务需求调整)
builder.Services.AddAuthorization(options =>
{
    options.AddPolicy("AdminAccess", policy => policy.RequireRole("Admin"));
});

若需更精细化控制Cookie,可针对AzureADB2C的Cookie方案单独配置:

builder.Services.ConfigureCookie(AzureADB2CDefaults.CookieScheme, options =>
{
    options.ExpireTimeSpan = TimeSpan.FromMinutes(20);
    options.SlidingExpiration = true;
    // 超时后跳转的登出路径
    options.LoginPath = "/MicrosoftIdentity/Account/SignOut";
    options.AccessDeniedPath = "/AccessDenied";
});

二、同步AzureADB2C令牌过期时间

AzureADB2C颁发的ID Token和Access Token需与Cookie超时保持一致,需在Azure门户调整:

  • 进入AzureADB2C控制台 → 选择你的用户流/自定义策略
  • 点击「属性」,将「ID令牌生存期(分钟)」和「访问令牌生存期(分钟)」设为20
  • 保存并发布策略

三、前端无活动检测与自动登出

后端Cookie超时后前端不会自动感知,需添加监听逻辑,检测用户无操作后触发登出:

创建SessionTimeout.razor组件:

@inject NavigationManager NavManager
@inject IAuthenticationService AuthService
@implements IDisposable

<div style="display: none"></div>

@code {
    private Timer _inactivityTimer;
    private const int TimeoutMinutes = 20;
    private readonly TimeSpan _timeoutSpan = TimeSpan.FromMinutes(TimeoutMinutes);

    protected override void OnInitialized()
    {
        ResetTimer();
        // 绑定用户活动监听事件
        JS.InvokeVoidAsync("addEventListener", "mousemove", DotNetObjectReference.Create(this).InvokeAsync<string>("ResetTimer"));
        JS.InvokeVoidAsync("addEventListener", "keydown", DotNetObjectReference.Create(this).InvokeAsync<string>("ResetTimer"));
        JS.InvokeVoidAsync("addEventListener", "scroll", DotNetObjectReference.Create(this).InvokeAsync<string>("ResetTimer"));
    }

    [JSInvokable]
    public void ResetTimer()
    {
        _inactivityTimer?.Dispose();
        _inactivityTimer = new Timer(OnTimeout, null, _timeoutSpan, Timeout.InfiniteTimeSpan);
    }

    private void OnTimeout(object state)
    {
        InvokeAsync(async () =>
        {
            await AuthService.SignOutAsync(new AuthenticationProperties
            {
                RedirectUri = NavManager.BaseUri
            });
        });
    }

    public void Dispose()
    {
        _inactivityTimer?.Dispose();
        // 移除监听避免内存泄漏
        JS.InvokeVoidAsync("removeEventListener", "mousemove", DotNetObjectReference.Create(this).InvokeAsync<string>("ResetTimer"));
        JS.InvokeVoidAsync("removeEventListener", "keydown", DotNetObjectReference.Create(this).InvokeAsync<string>("ResetTimer"));
        JS.InvokeVoidAsync("removeEventListener", "scroll", DotNetObjectReference.Create(this).InvokeAsync<string>("ResetTimer"));
    }
}

在MainLayout.razor中引入组件,确保全局生效:

@inherits LayoutComponentBase

<PageTitle>Blazor WebApp</PageTitle>

<SessionTimeout />

<div class="page">
    <!-- 你的布局内容 -->
</div>

四、验证配置有效性

  1. 登录后保持20分钟无操作,确认是否自动登出
  2. 中途进行鼠标移动、键盘输入等操作,检查Cookie过期时间是否刷新
  3. 确保应用运行在HTTPS环境(Cookie的SecurePolicy设为Always时,HTTP环境下Cookie不会被保存)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.17 20:57:43