Asp.Net Core 5搭配OpenIdDict时带认证的API请求报CORS错误如何解决?
问题原因
你遇到的CORS报错本质是两个原因共同导致的:
- 浏览器发送带自定义Authorization头的POST请求前,会先发送OPTIONS预检请求,这个请求不携带任何认证信息,会被你的API认证中间件直接拦截返回401
- ASP.NET Core默认不会给401这类异常响应自动追加CORS头,浏览器收不到合法的CORS响应头,就会抛出跨域错误,掩盖了实际的401认证失败问题
解决方案
按以下步骤依次修改API项目的配置:
1. 全局启用CORS策略
你当前只注册了CORS策略,没有绑定到端点,修改Configure方法里的端点配置:
application.UseEndpoints(x => { x.MapControllers().RequireCors("Cors"); });
2. 放行OPTIONS预检请求
在UseCors和UseAuthentication中间件之间加一个预检请求处理中间件,直接给OPTIONS请求返回200响应:
application.UseRouting(); application.UseCors("Cors"); // 新增这段代码 application.Use(async (context, next) => { if (context.Request.Method == "OPTIONS") { context.Response.StatusCode = StatusCodes.Status200OK; await context.Response.CompleteAsync(); return; } await next(); }); application.UseAuthentication(); application.UseAuthorization();
3. 排查token有效性
先用Postman等工具直接携带token请求API接口,确认返回结果是否为401:
- 如果返回401,先检查OpenIddict内省配置是否正确:确认你的Access Token的audience是否为
api、客户端配置是否匹配、token是否在有效期内 - 如果返回正常响应,说明是单纯的预检请求拦截问题,做完前两步即可解决
内容的提问来源于stack exchange,提问作者Miguel Moura
相关产品推荐
相关产品推荐

