JWT在Postman正常但ASP.NET Core 6 MVC调用API返回401未授权
我有两个ASP.NET Core 6应用:一个MVC Web应用,一个Web API。JWT令牌由Web API生成,Postman使用该令牌访问带[Authorize]特性的接口可正常返回200 OK,但MVC应用或独立控制台程序调用时,API端无法接收到Authorization请求头,导致返回401未授权响应。
解决方案
1. 修复MVC调用代码的变量名错误
在GetApiList方法中,参数传入的是userToken,但代码里错误使用了未定义的token变量,导致Authorization头未正确设置:
// 原错误代码 // client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", token); // 修改为:使用传入的userToken参数 client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", userToken);
2. 修正CORS配置的Origin格式
API的CORS策略中,WithOrigins的第一个Origin末尾多了斜杠,导致跨域匹配失败,浏览器/HTTP客户端会拦截Authorization头:
// 原错误配置 // builder.WithOrigins("https://localhost:7236/", "http://localhost:5236") // 修改为:去掉Origin末尾的斜杠,同时添加AllowCredentials支持身份头 builder.WithOrigins("https://localhost:7236", "http://localhost:5236") .AllowAnyHeader() .AllowAnyMethod() .AllowCredentials();
3. 避免HTTPS重定向丢失请求头
API启用了app.UseHttpsRedirection(),如果MVC调用的是HTTP地址,重定向到HTTPS时Authorization头会丢失。解决方式:
- MVC调用时直接使用API的HTTPS地址(如
https://localhost:7031/api/gallery/authtestapi) - 若需保持HTTP调用,可在开发环境临时注释
app.UseHttpsRedirection()(生产环境不推荐)
4. 规范Authorization头的设置方式
手动拼接Bearer +token容易出现空格错误,建议使用AuthenticationHeaderValue类构造头:
// 原代码 // client.DefaultRequestHeaders.Add("Authorization", "Bearer " + token); // 修改为更可靠的方式 client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", token);
5. 排查中间件或代理的头拦截问题
如果API使用了代理或自定义中间件,可能会拦截Authorization头。开发环境下可添加转发头配置:
// 在Program.cs的UseRouting前添加 app.UseForwardedHeaders(new ForwardedHeadersOptions { ForwardedHeaders = ForwardedHeaders.XForwardedFor | ForwardedHeaders.XForwardedProto });
内容的提问来源于stack exchange,提问作者barath thangam
相关产品推荐
相关产品推荐

