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

如何让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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.16 23:30:04