Angular9+Asp.NetCore3.1:JWT授权GET正常,POST等请求返回401求助
问题分析与解决方案
嘿,我一眼就揪出问题所在了——你的Angular HTTP POST请求的参数顺序写错了!这就是为什么同个授权逻辑下,GET能正常工作,POST却返回401的核心原因。
为什么GET没问题?
Angular的HttpClient.get()方法签名是这样的:
get(url: string, options?: { headers?: HttpHeaders; observe?: 'body'; ... })
你的GET请求把headers配置放在第二个参数的位置,完全符合方法要求,所以Authorization头能正常携带到服务端,授权自然通过。
为什么POST会失败?
但HttpClient.post()的签名不一样:
post(url: string, body: any, options?: { headers?: HttpHeaders; observe?: 'body'; ... })
你现在把headers对象直接当成了第二个参数——也就是POST请求的请求体,而真正的options参数(用来放headers的地方)根本没传!这就导致你的Authorization头根本没被发送到服务端,服务端自然识别不出授权信息,返回401错误。
至于Fiddler/Postman能成功,是因为你在这些工具里手动正确设置了Authorization头,没有参数顺序的错误,请求能正常携带授权信息到服务端。
修正后的POST代码
把请求体参数补上(哪怕是空对象或null),把headers配置放到第三个参数的位置:
this.http.post( this.baseUrl + "ControllerName/MethodName/" + id, {}, // POST请求必须传请求体,这里用空对象占位 { headers: new HttpHeaders({ "Content-Type": "application/json", "Authorization": "Bearer " + token }) } ).subscribe(response => { console.log(response); }, err => { console.log(err); });
额外注意:CORS预检请求
如果修正后还是有问题,可能是浏览器的CORS预检(OPTIONS请求)导致的:
- GET请求属于简单请求,不会触发OPTIONS预检;但POST请求携带自定义Authorization头时,会触发浏览器先发送OPTIONS预检请求。
- 如果你的服务端JWT授权中间件拦截了OPTIONS请求,就会返回401。这种情况下需要在服务端配置:允许OPTIONS请求跳过授权验证,同时在CORS设置中明确允许携带
Authorization头。
内容的提问来源于stack exchange,提问作者Carson Wiens
相关产品推荐
相关产品推荐

