本地MVC调用WEB API出现401.2错误,请求协助排查
解决MVC跨域调用Web API返回401.2的排查方案
我之前处理过好几起类似的跨域+身份验证问题,给你几个实际有效的排查方向,一步步来:
先确认凭证传递问题
浏览器直接访问API时,IIS Express默认会自动带上你的Windows身份凭证,但MVC项目发起的跨域请求默认不会传递这些凭证。你需要在请求代码里显式开启凭证传递:- 如果用jQuery/Ajax:
$.ajax({ url: "http://localhost:49374/api/xxx", type: "GET", xhrFields: { withCredentials: true // 关键:允许传递凭证 }, success: function(data) { ... } }); - 如果用.NET的HttpClient:
var handler = new HttpClientHandler(); handler.UseDefaultCredentials = true; // 使用当前用户的Windows凭证 var client = new HttpClient(handler); var response = await client.GetAsync("http://localhost:49374/api/xxx");
401.2错误很大概率是因为MVC请求没带凭证,而API启用了Windows认证这类需要凭证的验证方式。
- 如果用jQuery/Ajax:
核对CORS配置的完整性
别只看Web.config里的CORS节点,要确保API的CORS配置允许凭证传递:- 如果是在代码里配置(比如Startup.cs):
app.UseCors(builder => builder.WithOrigins("http://localhost:57062") // 明确允许MVC的地址 .AllowCredentials() // 必须开启这个,否则带凭证的跨域请求会被拦截 .AllowAnyHeader() .AllowAnyMethod()); - 如果是Web.config配置:
<system.webServer> <httpProtocol> <customHeaders> <add name="Access-Control-Allow-Origin" value="http://localhost:57062" /> <add name="Access-Control-Allow-Credentials" value="true" /> <add name="Access-Control-Allow-Headers" value="Content-Type" /> <add name="Access-Control-Allow-Methods" value="GET, POST, PUT, DELETE" /> </customHeaders> </httpProtocol> </system.webServer>
注意:
Access-Control-Allow-Origin不能设为*,必须指定具体的MVC地址,否则和AllowCredentials冲突。- 如果是在代码里配置(比如Startup.cs):
检查项目的身份验证设置
右键Web API项目→属性→调试→Web服务器设置,确认“Windows身份验证”是否启用;再看看MVC项目的身份验证模式,如果API用Windows认证,MVC用匿名,那MVC请求自然不会传凭证。另外,检查API的Web.config里的认证节点:<system.web> <authentication mode="Windows" /> <!-- 或者如果用其他认证,比如Bearer,要确保MVC请求带了正确的Token --> </system.web>对比请求头找差异
用浏览器F12开发者工具,分别捕获两种请求的头信息:- 浏览器直接访问API的请求头(看有没有
Authorization: Negotiate ...这类Windows认证头) - MVC项目调用API的请求头(看是不是缺少了认证头,或者Origin头不对)
重点对比Authorization、Origin、Cookie这几个头,差异点往往就是问题所在。
- 浏览器直接访问API的请求头(看有没有
临时测试授权规则
可以先在API的Web.config里临时修改授权规则,允许匿名访问:<system.web> <authorization> <allow users="*" /> </authorization> </system.web>如果修改后MVC能正常调用,说明核心问题是授权规则和凭证传递不匹配,再改回原来的规则,针对性调整凭证传递逻辑。
内容的提问来源于stack exchange,提问作者Alex
相关产品推荐
相关产品推荐

