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

ASP.NET Core 8 Web API中ClaimsPrincipal获取用户ID为空问题

解决方法
  • 确保API端点启用授权:在创建文章的控制器Action上添加[Authorize]属性,未授权的请求不会携带用户Claim。
  • 解析验证JWT Token内容:使用JWT解析工具查看Token的Payload部分,确认是否包含nameid字段,且值为正确的用户ID。
  • 核对JWT验证配置:在Program.cs的AddJwtBearer配置中,确保Issuer、Audience和密钥与生成Token时的参数完全一致,配置示例:
    builder.Services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme)
        .AddJwtBearer(options =>
        {
            options.TokenValidationParameters = new TokenValidationParameters
            {
                ValidateIssuer = true,
                ValidIssuer = builder.Configuration["Jwt:Issuer"],
                ValidateAudience = true,
                ValidAudience = builder.Configuration["Jwt:Audience"],
                ValidateIssuerSigningKey = true,
                IssuerSigningKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(builder.Configuration["Jwt:Key"]))
            };
        });
    
  • 直接使用JWT声明名称查找Claim:替换ClaimTypes.NameIdentifier为对应的JWT声明名"nameid",代码修改为:
    var userId = userPrincipal.FindFirst("nameid")?.Value;
    
  • 确认ClaimsPrincipal参数传递正确:确保控制器Action中调用CreateAsync时,传入的是控制器自带的User属性,而非自定义的空对象或其他值,示例:
    [HttpPost]
    [Authorize]
    public async Task<IActionResult> Create([FromBody] ArticleDto dto)
    {
        var article = await _articleService.CreateAsync(dto, User);
        return Ok(article);
    }
    
  • 检查Postman请求的Token携带方式:确认Token放在Authorization请求头中,选择Bearer类型,且Token字符串无多余空格或拼写错误。
  • 排查用户ID类型匹配问题:若数据库中User.Id为Guid类型,确保生成Token时的user.Id.ToString()格式与查询时的类型兼容,避免后续查找用户时出现问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.15 18:15:03