Angular 12 + .NET 5搭配Windows认证出现CORS跨域拦截问题如何解决?
问题根因
- 核心原因是仅启用Windows身份验证的IIS默认会拦截无身份凭证的OPTIONS预检请求:浏览器发起跨域POST请求前会先发送OPTIONS预检请求,这个请求不会携带Windows身份验证的凭证,IIS直接返回401未授权响应,此时.NET的CORS中间件还没机会执行,所以响应头里不会有
Access-Control-Allow-Origin字段,触发CORS报错。 - 次要原因是中间件顺序错误/缺失:你当前的
Configure方法里没有添加UseAuthentication、UseAuthorization中间件,且CORS中间件的位置没有放在身份验证中间件之前,也可能导致CORS规则未生效。 - 配置匹配问题:如果
appsettings.json中ClientApps:AdminPanel的配置值和实际前端地址http://localhost:4200不完全一致(比如多了末尾斜杠、端口错误),也会导致CORS规则不匹配。
解决方案
- 配置IIS允许OPTIONS请求匿名访问
在后端项目的web.config文件中添加如下配置,开启匿名身份验证单独对OPTIONS请求放行,其他接口仍然走Windows身份验证:
<configuration> <system.webServer> <security> <authentication> <anonymousAuthentication enabled="true" /> <windowsAuthentication enabled="true" /> </authentication> <authorization> <add accessType="Allow" verbs="OPTIONS" users="?" /> <add accessType="Allow" users="*" /> </authorization> </security> </system.webServer> </configuration>
如果IIS层面锁了匿名身份验证的配置,需要先在IIS管理器的对应站点-身份验证中,把匿名身份验证设置为允许。
- 修正.NET中间件顺序
调整Configure方法的中间件顺序,确保CORS中间件放在路由之后、身份验证中间件之前,同时补充缺失的身份验证/授权中间件:
public void Configure(IApplicationBuilder app, IWebHostEnvironment env) { app.UseMiddleware<ExceptionMiddleware>(); app.UseStatusCodePagesWithReExecute("/Errors/{0}"); app.UseRouting(); // CORS必须放在路由之后,身份验证之前 app.UseCors(AppCorsPolices.MainCorsPolicy.ToString()); // 补充缺失的身份验证、授权中间件 app.UseAuthentication(); app.UseAuthorization(); app.UseStaticFiles(); app.UseEndpoints(endpoints => { endpoints.MapControllers(); }); }
- 校验允许源配置
确认appsettings.json中的ClientApps:AdminPanel配置值严格等于http://localhost:4200,不要加末尾的斜杠,大小写也尽量保持一致,WithOrigins是严格匹配规则。
内容的提问来源于stack exchange,提问作者Ahmed Lotfi
相关产品推荐
相关产品推荐

