从WCF服务调用.NET Core Web API返回401未授权错误如何解决
WCF调用.NET Core Web API返回401错误的原因及解决方案
核心原因
- CORS配置冲突:ASP.NET Core CORS策略中
AllowCredentials()与通配符源*不兼容,这是W3C CORS规范的强制要求,同时配置二者会导致CORS校验逻辑异常,触发身份验证拦截。 - 托管服务身份验证顺序错误:若Windows身份验证优先级高于匿名身份验证,请求会先触发Windows身份验证挑战,直接返回401,不会执行接口上的
[AllowAnonymous]逻辑。 - 中间件配置顺序错误:若身份验证、授权中间件排在CORS中间件之前,会导致CORS策略未生效时就触发身份校验,返回401。
- WCF端
HttpClient默认携带无效凭据:若HttpClient默认开启了Windows凭据发送,携带的凭据不符合API要求时也会触发401。
解决方案
- 修复CORS配置:二选一调整,不可同时保留
AllowCredentials()和通配符源*:
若需要允许跨域请求携带凭据,仅保留实际用到的源地址:
若不需要携带凭据,删除services.AddCors(o => o.AddPolicy("CorsPolicy", builder => { builder .AllowAnyMethod() .AllowAnyHeader() .AllowCredentials() .WithOrigins("http://localhost:4200","http://你的实际WCF服务地址"); }));AllowCredentials()即可保留通配符:services.AddCors(o => o.AddPolicy("CorsPolicy", builder => { builder .AllowAnyMethod() .AllowAnyHeader() .AllowAnyOrigin(); })); - 调整身份验证优先级:
若使用IIS托管,打开IIS对应站点的「身份验证」设置,将「匿名身份验证」排序调整到「Windows身份验证」之前;
若使用IIS Express/Kestrel托管,修改appsettings.json配置确保匿名身份验证正常开启:"iisSettings": { "windowsAuthentication": true, "anonymousAuthentication": true, "iisExpress": { "applicationUrl": "http://localhost:你的端口", "sslPort": 0 } } - 修正中间件顺序:确保中间件执行顺序为CORS -> 身份验证 -> 授权 -> 端点映射,示例如下:
var app = builder.Build(); // 最先启用CORS app.UseCors("CorsPolicy"); app.UseAuthentication(); app.UseAuthorization(); app.MapControllers(); app.Run(); - 调整WCF端HttpClient配置:
若接口允许匿名访问,配置不发送默认凭据:
若需要走Windows身份验证,将var handler = new HttpClientHandler() { UseDefaultCredentials = false }; var client = new HttpClient(handler); client.BaseAddress = new Uri("http://你的API地址"); client.DefaultRequestHeaders.Accept.Clear(); client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json")); HttpResponseMessage response = await client.GetAsync("api/tasks"); return await response.Content.ReadAsStringAsync();UseDefaultCredentials设为true即可。
内容的提问来源于stack exchange,提问作者chana
相关产品推荐
相关产品推荐

