如何让ASP.NET Core 8 Web API支持认证/未认证用户并获取JWT用户ID
ASP.NET Core 8中实现可选JWT认证(AWS Cognito)并获取用户ID
可以实现允许未认证用户调用接口,同时从JWT中获取认证用户ID的需求,具体步骤如下:
1. 调整接口的认证属性
移除原来的[Authorize]属性,替换为[AllowAnonymous],这样接口将同时接受认证和未认证请求:
[AllowAnonymous] [HttpPost] public async Task<ActionResult<IRecord>> PostRecordA(Record rec) { // 后续逻辑 }
2. 获取认证用户的ID
ASP.NET Core会自动为携带有效JWT的请求填充User对象的Claims信息。AWS Cognito的JWT中,用户的唯一标识通常存储在sub Claim(全局唯一用户ID)或cognito:username Claim(用户名)中,你可以根据实际配置提取。
3. 数据库调用逻辑
通过User.Identity.IsAuthenticated判断用户是否已认证,分别处理两种情况:
[AllowAnonymous] [HttpPost] public async Task<ActionResult<IRecord>> PostRecordA(Record rec) { int userId = 0; if (User.Identity.IsAuthenticated) { // 提取Cognito JWT中的用户ID,这里以sub为例,根据实际情况调整Claim键 var userSub = User.FindFirstValue("sub"); // 若你的业务中用户ID是数字类型,需将sub转换为对应数字(比如从数据库查询映射关系) // 示例:userId = await userService.GetUserIdBySub(userSub); // 以下仅为演示,实际需根据你的ID体系调整 userId = int.TryParse(userSub, out var id) ? id : 0; } var id = await dbc.AddNew(userId, rec); return CreatedAtAction(nameof(GetRecord), new { id = id }, rec); }
注意事项
- 确保项目已正确配置AWS Cognito的JWT认证中间件,否则认证请求的
User对象不会被正确填充。 - 可通过解码JWT令牌确认具体的Claim键,常见的除了
sub和cognito:username,还可能有自定义Claim。 - 如果业务中用户ID是字符串类型(比如Cognito的sub是UUID格式),需调整
AddNew方法的参数类型,避免类型转换错误。
内容的提问来源于stack exchange,提问作者Kumar
相关产品推荐
相关产品推荐

