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

.NET 8 Blazor Server迁移后获取id_token为空的解决方法咨询

Blazor Server .NET8获取id_token为空的解决方法

1. 启用Token保存配置

在Program.cs的认证配置里,必须将OpenIdConnect的SaveTokens设为true,否则登录后的tokens不会被保存到认证属性中:

builder.Services.AddAuthentication(options =>
{
    options.DefaultScheme = CookieAuthenticationDefaults.AuthenticationScheme;
    options.DefaultChallengeScheme = OpenIdConnectDefaults.AuthenticationScheme;
})
.AddCookie()
.AddOpenIdConnect(options =>
{
    // 填入你的OIDC基础配置(Authority、ClientId、ClientSecret等)
    options.SaveTokens = true; // 关键:开启Token保存
});

2. 正确在App.razor中获取token

第一步:注册HttpContext访问服务

在Program.cs中添加IHttpContextAccessor的注册,这样才能在组件中访问HttpContext:

builder.Services.AddHttpContextAccessor();

第二步:在App.razor中注入并获取id_token

@inject IHttpContextAccessor HttpContextAccessor
@inject AuthenticationStateProvider AuthenticationStateProvider

@code {
    protected override async Task OnInitializedAsync()
    {
        // 先验证用户是否已认证
        var authState = await AuthenticationStateProvider.GetAuthenticationStateAsync();
        if (!authState.User.Identity.IsAuthenticated)
        {
            return;
        }

        // 获取HttpContext并提取id_token
        var httpContext = HttpContextAccessor.HttpContext;
        if (httpContext != null)
        {
            var idToken = await httpContext.GetTokenAsync("id_token");
            if (!string.IsNullOrWhiteSpace(idToken))
            {
                // 在此处使用id_token执行自定义认证/授权逻辑
            }
        }
    }
}

3. 注意渲染模式的限制

如果App.razor使用交互式服务器渲染(@rendermode InteractiveServer),HttpContext仅在初始服务器渲染阶段可用。如果后续交互需要用到token,建议在初始获取后将其存储到组件状态或全局服务中复用。

排查要点

  • 检查OIDC登录回调的网络响应,确认服务端确实返回了id_token;
  • 确保GetTokenAsync的参数是"id_token"(严格匹配大小写)。

内容的提问来源于stack exchange,提问作者Geoffrey

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.20 16:42:36