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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.17 18:15:05