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
相关产品推荐
相关产品推荐

