You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

Blazor WebAssembly中AuthenticationService.js抛出Cannot read properties of undefined (reading 'getUser')异常

Blazor WebAssembly中AuthenticationService.js抛出Cannot read properties of undefined (reading 'getUser')异常

我太懂这种启动阶段就炸锅的JS异常有多闹心了,尤其是连后端的AuthorizationController都没走到,完全不知道从哪下手排查。结合你描述的整个过程,我来梳理下这个问题的来龙去脉:

问题场景

你在Blazor Hosted应用中集成OpenIddict和默认Identity UI实现OIDC认证时,启动后直接在AuthenticationService.js中抛出了Cannot read properties of undefined (reading 'getUser')的错误,请求根本没到达后端控制器。

你服务器端创建OpenIddict客户端的核心代码:

var client = await manager.FindByClientIdAsync("blazorhosted-webclient", cancellationToken);

if (client is null)
{
    await manager.CreateAsync(new OpenIddictApplicationDescriptor
    {
        ClientId = "blazorhosted-webclient",
        ConsentType = OpenIddictConstants.ConsentTypes.Explicit,
        DisplayName = "MetaProcessor",
        Type = OpenIddictConstants.ClientTypes.Public,
        PostLogoutRedirectUris =
        {
            new Uri($"{baseURL}/authentication/logout-callback")
        },
        RedirectUris =
        {
            new Uri($"{baseURL}/authentication/login-callback")
        },
        Permissions =
        {
            OpenIddictConstants.Permissions.Endpoints.Authorization,
            OpenIddictConstants.Permissions.Endpoints.Logout,
            OpenIddictConstants.Permissions.Endpoints.Token,
            OpenIddictConstants.Permissions.GrantTypes.AuthorizationCode,
            OpenIddictConstants.Permissions.GrantTypes.RefreshToken,
            OpenIddictConstants.Permissions.ResponseTypes.Code,
            OpenIddictConstants.Permissions.Scopes.Email,
            OpenIddictConstants.Permissions.Scopes.Profile,
            OpenIddictConstants.Permissions.Scopes.Roles
        },
        Requirements =
        {
            OpenIddictConstants.Requirements.Features.ProofKeyForCodeExchange
        }
    }, cancellationToken);
}

前端客户端的OIDC注册代码:

builder.Services.AddHttpClient("BlazorHosted.ServerAPI", client => client.BaseAddress = new Uri(builder.HostEnvironment.BaseAddress))
    .AddHttpMessageHandler<BaseAddressAuthorizationMessageHandler>();

builder.Services.AddScoped(sp => sp.GetRequiredService<IHttpClientFactory>().CreateClient("BlazorHosted.ServerAPI"));

builder.Services.AddOidcAuthentication(options =>
{
    options.ProviderOptions.ClientId = "blazorhosted-webclient";
    options.ProviderOptions.Authority = $"{builder.HostEnvironment.BaseAddress}";
    options.ProviderOptions.ResponseType = "code";
    options.ProviderOptions.ResponseMode = "query";
});

你已经完成的有效排查步骤

这些都是遇到认证类问题时非常值得参考的常规操作:

  • 反复核对OpenIddict前后端配置中的ClientId,确保完全一致
  • 检查所有NuGet包版本,确认Microsoft相关认证组件版本匹配
  • 验证本地.NET SDK安装版本符合项目要求
  • 尝试降级Microsoft.AspNetCore.Components.WebAssembly及相关依赖包,排查版本冲突
  • 对比已有正常运行的OpenIddict项目,核对配置差异
  • 确认AuthorizationController的代码配置无误

最终解决方法

你提到改用自带OIDC配置的Blazor Hosted项目模板从头构建后,问题彻底消失。这说明大概率是之前手动配置OIDC时遗漏了某个关键细节,或者配置项之间存在隐性冲突。这类问题常见的诱因包括:

  1. OIDC客户端配置不完整:比如前端配置没有正确对应后端要求的PKCE验证(虽然你后端加了ProofKeyForCodeExchange要求,但前端可能缺少相关初始化逻辑)
  2. 前后端认证路径不匹配:登录/登出回调路径的URI格式错误,或者前端AuthenticationPaths的默认配置和后端不兼容
  3. 依赖包隐性冲突:即使你核对了直接依赖的包版本,某些间接依赖的组件可能存在版本不一致,导致AuthenticationService.js无法正确初始化

后续排查小技巧

如果以后再遇到类似问题,可以试试这些操作:

  • 清空浏览器缓存和本地存储(尤其是认证相关的token数据,避免旧数据干扰)
  • 打开浏览器开发者工具的网络面板,查看认证初始化阶段的请求是否有失败或异常
  • 仔细核对前端AddOidcAuthentication中的AuthorityResponseTypeResponseMode等参数,确保和后端OpenIddict的客户端配置完全匹配

备注:内容来源于stack exchange,提问作者Zasam

火山引擎 最新活动