AWS CloudFront API浏览器可正常访问 .NET HttpClient请求报403错误
问题成因分析
1. 请求方法与载荷不匹配
浏览器侧正常请求是GET方法,而你的.NET代码无论传入什么请求方法,都强制为请求设置了newRequest.Content请求体。按照HTTP规范GET请求不应携带请求体,CloudFront绑定的WAF规则通常会直接拦截携带请求体的GET请求,返回403错误。
2. 必要请求头缺失
浏览器请求携带了多类CloudFront/WAF校验需要的头字段,你的.NET代码仅设置了Accept头,缺少以下关键校验项,触发合法性校验拦截:
User-Agent:多数CloudFront分发会校验合法UA标识,未手动设置时HttpClient自带的默认UA很容易被识别为非浏览器请求拦截Accept-Encoding、Accept-Language:部分WAF规则会校验这两个头的存在性与合法性,缺失会被判定为异常请求- 业务会话Cookie:浏览器请求携带了
AWSALB、AWSALBCORS以及站点会话Cookie,你的代码完全未携带这类会话凭证,无法通过服务端的身份校验
3. 代码逻辑错误
你提供的代码存在两处明显逻辑问题:
- 声明的客户端变量为
clientNew,但设置超时的时候调用的是未声明的client变量,超时设置完全不生效,若实际运行代码确实存在该问题,可能导致请求异常参数传递错误 - 直接调用
response.Result同步等待异步请求,高并发场景下会引发线程死锁,虽然不会直接导致403,但可能引发请求异常触发拦截规则
4. CloudFront WAF规则拦截
CloudFront通常会绑定WAF防护规则,会对请求特征做多重校验:
- 你的应用服务器出口IP可能被WAF加入了拦截黑名单
- 请求特征与正常浏览器差异过大,触发了WAF的爬虫拦截规则
- URL中的特殊字符未做正确编码,触发非法请求拦截规则
5. TLS握手异常
虽然你设置了支持多版本TLS协议,但部分CloudFront分发仅支持特定的TLS加密套件,若.NET HttpClient默认的加密套件不在CloudFront支持列表内,会导致TLS握手失败被判定为非法请求,返回403。
内容的提问来源于stack exchange,提问作者Lakshman Pilaka
相关产品推荐
相关产品推荐

