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

如何防止通过JWT Token替他人向ASP.NET Web API发送请求

解决ASP.NET Web API中JWT身份验证下代他人请求的问题

问题根源在于你的接口依赖客户端传入的userMail参数,而这个参数完全不可信,客户端可以随意篡改。正确的做法是从JWT令牌中提取已验证的用户身份信息,而非接收外部传入的用户标识。

具体实现步骤

  1. 从JWT Claims中提取用户邮箱
    ASP.NET在验证JWT令牌通过后,会将令牌中的声明(Claims)存入HttpContext.User,你可以直接从这里获取可信的用户邮箱,无需客户端传入。

  2. 修改接口代码
    移除接口中的userMail参数,改为从Claims中读取:

[HttpPost]
public async Task<IActionResult> Post()
{
    // 从JWT Claims中获取用户邮箱(这里假设Claim类型为ClaimTypes.Email,根据你的实际签发逻辑调整)
    var userMail = HttpContext.User.FindFirstValue(ClaimTypes.Email);
    
    if (string.IsNullOrEmpty(userMail))
    {
        return Unauthorized("无法获取有效用户身份");
    }
    
    return Ok(await _writeService.RenameAndSaveFile(Request.Form.Files.FirstOrDefault(), userMail));
}
  1. 确保签发Token时包含邮箱Claim
    签发JWT令牌的逻辑中,必须将用户邮箱加入Claims,这样后续才能从HttpContext.User中读取到,示例代码:
var claims = new List<Claim>
{
    new Claim(ClaimTypes.Email, authenticatedUser.Email),
    // 其他必要的声明(如用户ID、角色等)
};

// 生成JWT令牌的逻辑...
var securityToken = new JwtSecurityToken(
    issuer: "your-issuer",
    audience: "your-audience",
    claims: claims,
    expires: DateTime.UtcNow.AddHours(1),
    signingCredentials: new SigningCredentials(yourSecurityKey, SecurityAlgorithms.HmacSha256)
);

关键注意事项

  • 彻底移除所有接口中接收用户标识(如邮箱、ID)的参数,避免后续误用不可信的客户端输入
  • 确保JWT验证中间件已正确配置,能自动解析并验证令牌,将用户信息注入HttpContext.User
  • 严格保密JWT签名密钥,防止令牌被伪造篡改

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.20 10:50:03