EF Core搭建的WebAPI部署后Post、Put请求返回403错误如何解决
问题排查与解决方案
以下是按优先级排序的可操作解决步骤:
排查Web服务器的HTTP谓词拦截规则
这是部署后非GET请求返回403的最高发原因:
- 如果使用IIS部署:默认安装的WebDAV模块会主动拦截PUT、POST等写入类请求,在项目根目录新增/修改
web.config文件,添加如下配置禁用拦截:<system.webServer> <modules> <remove name="WebDAVModule" /> </modules> <handlers> <remove name="WebDAV" /> <remove name="ExtensionlessUrlHandler-Integrated-4.0" /> <add name="ExtensionlessUrlHandler-Integrated-4.0" path="*." verb="GET,HEAD,POST,DEBUG,PUT,DELETE,PATCH,OPTIONS" type="System.Web.Handlers.TransferRequestHandler" preCondition="integratedMode,runtimeVersionv4.0" /> </handlers> </system.webServer> - 如果使用Nginx部署:检查站点配置文件的
location块,是否存在限制请求方法的规则,比如if ($request_method !~ ^(GET|HEAD)$ ) {return 403;},将需要用到的POST、PUT方法添加到规则的允许列表即可。
- 如果使用IIS部署:默认安装的WebDAV模块会主动拦截PUT、POST等写入类请求,在项目根目录新增/修改
检查CORS策略配置
本地测试时域名匹配不会触发CORS限制,部署后跨域场景下如果CORS策略未放行写入类请求也会返回403,确认
Program.cs中的配置逻辑正确,且中间件顺序无误:// 服务注册阶段 builder.Services.AddCors(options => { options.AddPolicy("自定义策略名", policy => { policy.WithOrigins("你的前端域名") // 显式放行需要的请求方法,也可以用AllowAnyMethod()放行所有 .WithMethods("GET", "POST", "PUT", "DELETE") .AllowAnyHeader(); }); }); // 中间件配置阶段,必须放在UseRouting之后、UseAuthorization之前 app.UseCors("自定义策略名");检查写入权限配置
GET请求仅需要读取权限,POST/PUT请求涉及写入操作,对应权限不足会触发403:
- 给站点运行身份(IIS下为应用程序池对应的账户、IUSR,Linux下为www-data等运行用户)分配站点目录、静态资源存储目录的修改权限
- 确认数据库连接字符串使用的账号,具备对应表的INSERT、UPDATE操作权限
排查CSRF验证规则
如果项目开启了默认的防伪令牌验证,前端请求未携带有效令牌时会返回403,可先在对应接口的Action上添加
[IgnoreAntiforgeryToken]特性临时禁用验证,确认是该问题后再调整前端逻辑,请求时携带正确的防伪令牌。排查服务器安全规则拦截
服务器开启的WAF(Web应用防火墙)、操作系统防火墙、云服务商安全组规则,可能会默认拦截POST/PUT等写入类请求,可临时关闭相关安全组件测试,确认是规则拦截后将对应接口路径添加到白名单即可。
内容的提问来源于stack exchange,提问作者Chim Di Tru
相关产品推荐
相关产品推荐

