Blazor Server结合CleanCode架构下ASP.NET Core Identity登录状态异常问题
问题原因
- 缺少Blazor认证状态级联传递:
AuthorizeView组件依赖上层组件传递的CascadingAuthenticationState级联值才能获取用户认证状态,若根组件未包裹该组件,所有Blazor页面都无法识别登录状态。 - 认证方案被意外覆盖:
AddIdentityServerJwt是为API接口设计的JWT认证扩展,调用后会修改默认认证方案为JWT,但Blazor Server和Identity默认登录使用Cookie认证,方案不匹配导致无法读取Cookie中的登录凭证。
解决方案
步骤1:修正根组件配置
打开App.razor文件,用CascadingAuthenticationState包裹所有路由逻辑,示例代码如下:
<CascadingAuthenticationState> <Router AppAssembly="@typeof(App).Assembly"> <Found Context="routeData"> <AuthorizeRouteView RouteData="@routeData" DefaultLayout="@typeof(MainLayout)" /> </Found> <NotFound> <LayoutView Layout="@typeof(MainLayout)"> <p>抱歉,你访问的页面不存在。</p> </LayoutView> </NotFound> </Router> </CascadingAuthenticationState>
步骤2:显式指定默认认证方案
修改外部项目AddInfrastructure扩展方法中的认证服务注册逻辑,明确指定默认使用Identity的Cookie认证方案:
// 替换原有services.AddAuthentication().AddIdentityServerJwt();代码 services.AddAuthentication(options => { options.DefaultScheme = IdentityConstants.ApplicationScheme; options.DefaultSignInScheme = IdentityConstants.ExternalScheme; }) .AddIdentityServerJwt();
步骤3:验证修复效果
可以在LoginDisplay.razor中添加测试代码,确认认证状态读取正常:
@inject AuthenticationStateProvider AuthStateProvider @code { protected override async Task OnInitializedAsync() { var state = await AuthStateProvider.GetAuthenticationStateAsync(); System.Diagnostics.Debug.WriteLine($"是否登录:{state.User.Identity?.IsAuthenticated},用户名:{state.User.Identity?.Name}"); } }
重启项目后登录,若调试窗口输出正确的登录状态,说明问题已修复。
内容的提问来源于stack exchange,提问作者DShorty
相关产品推荐
相关产品推荐

