PUT 请求抛出 403 CORS 错误 Asp.Net Core 3.1 + Vue3 +IIS10
PUT requests are throwing 403 CORS error Asp.Net Core 3.1 + Vue3 +IIS10
我花了一整天的时间试图为此找到解决方案,并尝试了这些 SOF 帖子中几乎所有投票最高的答案 here, here and here。
情况是这样的:
- GET 和 POST 请求工作正常
- PUT 请求抛出 403,如下所示
我们目前没有任何 DELETE 请求来测试它是否也受到影响
我们有两个存储库 (1) 后端 API - 使用 .Net Core 3.1 和 (2) Vue3/typescript/Axios 客户端,部署到两个域,api 到 my-api.blahblah.com
和 Web 客户端到 www.blahblah.com
。可能相关与否,但它在 VPS 运行 Windows Server 2019 和 IIS10 上。有两个独立的原因是让它们独立部署,独立的管道设置和工作正常。
startup.cs 中的 CORS 设置如下所示,我根据上面 SOF 链接的答案尝试了这些的不同变体:
services.AddCors(options =>
{
options.AddPolicy("CorsPolicy", policy =>
{
policy
.AllowAnyOrigin()
.AllowAnyHeader()
.AllowAnyMethod();
});
});
...
app.UseCors("CorsPolicy");
app.UseRouting();
app.UseAuthentication();
app.UseAuthorization();
Web 客户端的 web.config 文件如下所示:
和 api 域的 web.config 是这样的:
希望我已经添加了足够的信息,但如果我遗漏了什么,请告诉我。
我觉得我错过了一些非常微不足道的东西来让 PUT 请求工作,但也许是我糟糕的一天。
提前致谢。
编辑 1:附加信息
- 通过 POSTMAN 的请求也失败并显示 403。
- 这些应用程序在本地 IIS(开发机器)上运行良好。
编辑 2:
- DELETE 无法正常工作,抛出相同的 CORS 错误
- 这不是身份验证问题,因为我在 API 中的几个 PUT 和 DELETE 端点上放置了 [AllowAnnonymous] 并重新部署了它,但仍然遇到与以前相同的错误
- IIS 在允许对下面的 PUT 端点进行匿名访问后的一些最后条目(PUT 上的通知 403):
2021-12-15 19:29:37 SERVER_IP_REDACTED GET /api/employeeAddress PageIndex=0&PageSize=10 443 - MY_IP_REDACTED HTTP/2 Mozilla/5.0+(Windows+NT+10.0;+Win64;+x64)+AppleWebKit/537.36+(KHTML,+like+Gecko)+Chrome/xx.xx.xx.xx+Safari/537.36 https://WEBSITE_NAME_REDACTED/ MY_API 200 0 0 718 1558 364
2021-12-15 19:29:49 SERVER_IP_REDACTED OPTIONS /api/employeeAddress/10 - 443 - MY_IP_REDACTED HTTP/2 Mozilla/5.0+(Windows+NT+10.0;+Win64;+x64)+AppleWebKit/537.36+(KHTML,+like+Gecko)+Chrome/xx.xx.xx.xx+Safari/537.36 https://WEBSITE_NAME_REDACTED/ MY_API 204 0 0 305 623 70
2021-12-15 19:29:49 SERVER_IP_REDACTED GET /api/employeeAddress/10 - 443 - MY_IP_REDACTED HTTP/2 Mozilla/5.0+(Windows+NT+10.0;+Win64;+x64)+AppleWebKit/537.36+(KHTML,+like+Gecko)+Chrome/xx.xx.xx.xx+Safari/537.36 https://WEBSITE_NAME_REDACTED/ MY_API 200 0 0 393 1537 95
2021-12-15 19:29:55 SERVER_IP_REDACTED OPTIONS /api/employeeAddress/10 - 443 - MY_IP_REDACTED HTTP/2 Mozilla/5.0+(Windows+NT+10.0;+Win64;+x64)+AppleWebKit/537.36+(KHTML,+like+Gecko)+Chrome/xx.xx.xx.xx+Safari/537.36 https://WEBSITE_NAME_REDACTED/ MY_API 204 0 0 318 636 84
2021-12-15 19:29:55 SERVER_IP_REDACTED PUT /api/employeeAddress/10 - 443 - MY_IP_REDACTED HTTP/2 Mozilla/5.0+(Windows+NT+10.0;+Win64;+x64)+AppleWebKit/537.36+(KHTML,+like+Gecko)+Chrome/xx.xx.xx.xx+Safari/537.36 https://WEBSITE_NAME_REDACTED/ MY_API 403 0 0 1452 1712 74
编辑 3
要求的 EmployeeAddressController 屏幕截图:
你读过https://docs.microsoft.com/en-us/aspnet/core/security/cors?view=aspnetcore-6.0了吗?
它说:
Calls the UseCors extension method and specifies the _myAllowSpecificOrigins CORS policy. UseCors adds the CORS middleware. The call to UseCors must be placed after UseRouting, but before UseAuthorization. For more information, see Middleware order.
您的 UseCors
顺序错误。
此外,反应是什么headers?它提到 CORS 了吗?这也可能有助于了解。
另外,看看Whosebug的问题指南。在这些情况下,link 包含您的问题的示例小项目会很有用,因为这样人们就可以对其进行调试并更好地帮助您解决问题。
这不是我如何配置管道或 Cors 的问题。
正如我在问题中提到的,我使用的是 VPS 主机,ModSecurity(防火墙)设置有一些阻止这些请求的规则。我不得不联系托管服务提供商的客户支持,他们一一关闭了一些规则。
即便如此,一些 PUT/DELETE 端点仍在工作,而其他端点开始抛出 405(而不是我最初得到的 403)。
为了修复 405 错误,我在 web.config 文件中添加了以下内容:
<system.webServer>
<modules>
<remove name="WebDAVModule" />
</modules>
<handlers>
<remove name="aspNetCore" />
<remove name="WebDAV" />
<!-- I removed the following handlers too, but these
can probably be ignored for most installations -->
<remove name="ExtensionlessUrlHandler-Integrated-4.0" />
<remove name="OPTIONSVerbHandler" />
<remove name="TRACEVerbHandler" />
<add name="aspNetCore"
path="*"
verb="*"
modules="AspNetCoreModuleV2"
resourceType="Unspecified" />
</handlers>
<aspNetCore processPath="dotnet"
arguments=".\xxx.xxxxxxx.WebApi.dll"
stdoutLogEnabled="false"
stdoutLogFile=".\logs\stdout"
hostingModel="inprocess" />
</system.webServer>
这解决了我的问题。然而,我已经从 VPS 转移到 Azure App Service,我通过艰难的方式了解到 VPS 可能更便宜,但不值得麻烦。在 azure 中发布到应用服务后,webapi 开箱即用,无需更改。
我花了一整天的时间试图为此找到解决方案,并尝试了这些 SOF 帖子中几乎所有投票最高的答案 here, here and here。
情况是这样的:
- GET 和 POST 请求工作正常
- PUT 请求抛出 403,如下所示
我们目前没有任何 DELETE 请求来测试它是否也受到影响
我们有两个存储库 (1) 后端 API - 使用 .Net Core 3.1 和 (2) Vue3/typescript/Axios 客户端,部署到两个域,api 到 my-api.blahblah.com
和 Web 客户端到 www.blahblah.com
。可能相关与否,但它在 VPS 运行 Windows Server 2019 和 IIS10 上。有两个独立的原因是让它们独立部署,独立的管道设置和工作正常。
startup.cs 中的 CORS 设置如下所示,我根据上面 SOF 链接的答案尝试了这些的不同变体:
services.AddCors(options =>
{
options.AddPolicy("CorsPolicy", policy =>
{
policy
.AllowAnyOrigin()
.AllowAnyHeader()
.AllowAnyMethod();
});
});
...
app.UseCors("CorsPolicy");
app.UseRouting();
app.UseAuthentication();
app.UseAuthorization();
Web 客户端的 web.config 文件如下所示:
和 api 域的 web.config 是这样的:
希望我已经添加了足够的信息,但如果我遗漏了什么,请告诉我。
我觉得我错过了一些非常微不足道的东西来让 PUT 请求工作,但也许是我糟糕的一天。
提前致谢。
编辑 1:附加信息
- 通过 POSTMAN 的请求也失败并显示 403。
- 这些应用程序在本地 IIS(开发机器)上运行良好。
编辑 2:
- DELETE 无法正常工作,抛出相同的 CORS 错误
- 这不是身份验证问题,因为我在 API 中的几个 PUT 和 DELETE 端点上放置了 [AllowAnnonymous] 并重新部署了它,但仍然遇到与以前相同的错误
- IIS 在允许对下面的 PUT 端点进行匿名访问后的一些最后条目(PUT 上的通知 403):
2021-12-15 19:29:37 SERVER_IP_REDACTED GET /api/employeeAddress PageIndex=0&PageSize=10 443 - MY_IP_REDACTED HTTP/2 Mozilla/5.0+(Windows+NT+10.0;+Win64;+x64)+AppleWebKit/537.36+(KHTML,+like+Gecko)+Chrome/xx.xx.xx.xx+Safari/537.36 https://WEBSITE_NAME_REDACTED/ MY_API 200 0 0 718 1558 364
2021-12-15 19:29:49 SERVER_IP_REDACTED OPTIONS /api/employeeAddress/10 - 443 - MY_IP_REDACTED HTTP/2 Mozilla/5.0+(Windows+NT+10.0;+Win64;+x64)+AppleWebKit/537.36+(KHTML,+like+Gecko)+Chrome/xx.xx.xx.xx+Safari/537.36 https://WEBSITE_NAME_REDACTED/ MY_API 204 0 0 305 623 70
2021-12-15 19:29:49 SERVER_IP_REDACTED GET /api/employeeAddress/10 - 443 - MY_IP_REDACTED HTTP/2 Mozilla/5.0+(Windows+NT+10.0;+Win64;+x64)+AppleWebKit/537.36+(KHTML,+like+Gecko)+Chrome/xx.xx.xx.xx+Safari/537.36 https://WEBSITE_NAME_REDACTED/ MY_API 200 0 0 393 1537 95
2021-12-15 19:29:55 SERVER_IP_REDACTED OPTIONS /api/employeeAddress/10 - 443 - MY_IP_REDACTED HTTP/2 Mozilla/5.0+(Windows+NT+10.0;+Win64;+x64)+AppleWebKit/537.36+(KHTML,+like+Gecko)+Chrome/xx.xx.xx.xx+Safari/537.36 https://WEBSITE_NAME_REDACTED/ MY_API 204 0 0 318 636 84
2021-12-15 19:29:55 SERVER_IP_REDACTED PUT /api/employeeAddress/10 - 443 - MY_IP_REDACTED HTTP/2 Mozilla/5.0+(Windows+NT+10.0;+Win64;+x64)+AppleWebKit/537.36+(KHTML,+like+Gecko)+Chrome/xx.xx.xx.xx+Safari/537.36 https://WEBSITE_NAME_REDACTED/ MY_API 403 0 0 1452 1712 74
编辑 3 要求的 EmployeeAddressController 屏幕截图:
你读过https://docs.microsoft.com/en-us/aspnet/core/security/cors?view=aspnetcore-6.0了吗?
它说:
Calls the UseCors extension method and specifies the _myAllowSpecificOrigins CORS policy. UseCors adds the CORS middleware. The call to UseCors must be placed after UseRouting, but before UseAuthorization. For more information, see Middleware order.
您的 UseCors
顺序错误。
此外,反应是什么headers?它提到 CORS 了吗?这也可能有助于了解。
另外,看看Whosebug的问题指南。在这些情况下,link 包含您的问题的示例小项目会很有用,因为这样人们就可以对其进行调试并更好地帮助您解决问题。
这不是我如何配置管道或 Cors 的问题。
正如我在问题中提到的,我使用的是 VPS 主机,ModSecurity(防火墙)设置有一些阻止这些请求的规则。我不得不联系托管服务提供商的客户支持,他们一一关闭了一些规则。
即便如此,一些 PUT/DELETE 端点仍在工作,而其他端点开始抛出 405(而不是我最初得到的 403)。
为了修复 405 错误,我在 web.config 文件中添加了以下内容:
<system.webServer>
<modules>
<remove name="WebDAVModule" />
</modules>
<handlers>
<remove name="aspNetCore" />
<remove name="WebDAV" />
<!-- I removed the following handlers too, but these
can probably be ignored for most installations -->
<remove name="ExtensionlessUrlHandler-Integrated-4.0" />
<remove name="OPTIONSVerbHandler" />
<remove name="TRACEVerbHandler" />
<add name="aspNetCore"
path="*"
verb="*"
modules="AspNetCoreModuleV2"
resourceType="Unspecified" />
</handlers>
<aspNetCore processPath="dotnet"
arguments=".\xxx.xxxxxxx.WebApi.dll"
stdoutLogEnabled="false"
stdoutLogFile=".\logs\stdout"
hostingModel="inprocess" />
</system.webServer>
这解决了我的问题。然而,我已经从 VPS 转移到 Azure App Service,我通过艰难的方式了解到 VPS 可能更便宜,但不值得麻烦。在 azure 中发布到应用服务后,webapi 开箱即用,无需更改。