Windows Authentication返回401未授权的问题排查求助
问题根源分析及解决方案
核心原因:跨域请求未正确携带Windows凭证,且后端CORS配置不匹配
Swagger能正常工作是因为它和API处于同域环境,浏览器会自动发送当前用户的Windows凭证;而React前端属于跨域请求,默认不会携带凭证,同时后端CORS配置可能未允许凭证传递,导致服务器返回401并要求Negotiate认证,但浏览器无法触发凭证发送。
具体问题点及修复方式:
Axios未配置携带凭证
axios默认不会在跨域请求中携带用户凭证,需要显式开启withCredentials:// React中axios请求示例 axios.get('/api/user', { withCredentials: true }) .then(res => console.log(res.data)) .catch(err => console.error(err));后端CORS配置不符合Windows认证要求
Windows认证需要CORS允许携带凭证,且AllowedOrigins不能使用通配符*,必须指定前端的具体域名。修改ASP.NET Web API的Program.cs:builder.Services.AddCors(options => { options.AddPolicy("ReactCorsPolicy", policy => { policy.WithOrigins("http://localhost:3000") // 替换为你的React实际域名 .AllowAnyHeader() .AllowAnyMethod() .AllowCredentials(); // 必须开启此选项,允许凭证传递 }); }); // 注意:UseCors必须在UseAuthentication和UseAuthorization之前调用 app.UseCors("ReactCorsPolicy");浏览器对跨域Windows凭证的限制
现代浏览器仅对同域或标记为本地Intranet的站点自动发送Windows凭证。如果前端域名不在浏览器的Intranet区域:- 打开浏览器设置,将前端域名添加到本地Intranet站点列表;
- 启用浏览器的"自动登录到Intranet站点"选项(不同浏览器路径略有差异)。
内容的提问来源于stack exchange,提问作者salperen
相关产品推荐
相关产品推荐

