Blazor WASM对接IdentityServer4时CheckSession iframe无限循环问题咨询
Blazor WASM对接IdentityServer4 CheckSession循环问题解答
问题1:CheckSession IFrame校验频率不足1秒是否属于正常预期?
不属于正常预期。
OIDC协议规范下默认的会话校验间隔为2秒,Blazor官方认证库的默认配置也为2秒。出现低于1秒的高频校验,几乎都是配置不匹配导致的异常循环:通常是IdentityServer返回的会话状态值每次请求都发生变化,触发了客户端的状态变更逻辑,导致客户端反复发起校验甚至静默刷新请求,才会出现每秒生成多个子iframe的情况。
可以先排查客户端配置的ClientId、授权回调地址、允许的scope是否和IdentityServer端的客户端配置完全一致,绝大多数这类循环问题都是配置不一致导致的。
问题2:Blazor中是否支持配置该会话校验的时间间隔?
支持。Blazor WASM的认证库底层封装了oidc-client-js,你可以在注入认证服务时直接修改校验间隔参数,单位为毫秒,配置示例如下:
// Program.cs 中配置 builder.Services.AddOidcAuthentication(options => { options.ProviderOptions.Authority = "http://localhost:5000"; options.ProviderOptions.ClientId = "你的客户端ID"; options.ProviderOptions.ResponseType = "code"; // 配置会话校验间隔为5秒 options.UserOptions.CheckSessionInterval = 5000; });
问题3:是否支持关闭该自动校验功能,改为手动触发会话校验?
支持。
关闭自动校验
只需把CheckSessionInterval参数设为0即可关闭自动会话校验:
options.UserOptions.CheckSessionInterval = 0;
手动触发校验
你可以在需要的场景(比如用户点击操作、自定义定时器触发)通过JS互操作调用底层认证接口实现手动校验,示例代码如下:
@inject AuthenticationStateProvider AuthStateProvider @inject IJSRuntime JSRuntime @inject NavigationManager NavManager @code { private async Task ManualCheckSessionAsync() { // 触发会话状态校验 await JSRuntime.InvokeVoidAsync("AuthenticationService.querySessionStatus"); // 刷新本地认证状态 var authState = await AuthStateProvider.GetAuthenticationStateAsync(); if (!authState.User.Identity.IsAuthenticated) { // 会话过期后的自定义逻辑,例如跳转到登录页 NavManager.NavigateTo("authentication/login"); } } }
关闭自动校验后需要自行处理会话过期的检测逻辑,避免用户身份已过期但前端未感知的问题。
内容的提问来源于stack exchange,提问作者Brendan
相关产品推荐
相关产品推荐

