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>
四、验证配置有效性
- 登录后保持20分钟无操作,确认是否自动登出
- 中途进行鼠标移动、键盘输入等操作,检查Cookie过期时间是否刷新
- 确保应用运行在HTTPS环境(Cookie的
SecurePolicy设为Always时,HTTP环境下Cookie不会被保存)
内容的提问来源于stack exchange,提问作者Ram
相关产品推荐
相关产品推荐

