.net core 3.1 中的 CORS 阻止了 Httppost 和 httpput
Posted
技术标签:
【中文标题】.net core 3.1 中的 CORS 阻止了 Httppost 和 httpput【英文标题】:Httppost and httpput blocked by CORS in .net core 3.1 【发布时间】:2021-06-01 03:17:30 【问题描述】:当我通过 Angular 10 前端将 httppost 和 httput(httpget 可以)制作到 API .net core 3.1 时遇到问题,控制台应用程序中的错误是著名的: 从源“http://localhost:4200”访问“http://localhost:23645/api/Toolbar/Search”处的 XMLHttpRequest 已被 CORS 策略阻止:对预检请求的响应未通过访问控制检查:否请求的资源上存在“Access-Control-Allow-Origin”标头。
capture
这是我前面请求的代码:
constructor(private Http: HttpClient)
this.header = new HttpHeaders(
'content-type': 'application/json'
)
searchToolbar(search: string): Observable<ToolbarSearchResultItem[]>
return this.Http.post(this.url + '/myController/Search', "search": search , headers: this.header, withCredentials:true).pipe(tap((response: myTyoe[]) =>
return response;
));
这是我在 Startup.cs 中的代码:
public void ConfigureServices(IServiceCollection services)
log.Info("ConfigureServices");
try
IConfigurationRoot configurationRoot = builder.Build();
services.AddCors(opt => opt.AddPolicy("CorsPolicy", c =>
c.WithOrigins("http://localhost:4200")
.AllowAnyMethod()
.AllowAnyHeader()
.AllowCredentials();
));
services.AddAuthorization(options =>
options.AddPolicy("AllUsers", policy => policy.RequireAuthenticatedUser());
);
services.AddControllers();
services.AddMvc();
catch (Exception ex)
log.Error("Error in ConfigureServices" + ex.Message + ex.StackTrace);
public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
try
if (env.IsDevelopment())
app.UseDeveloperExceptionPage();
app.UseRouting();
app.UseCors("CorsPolicy");
app.UseAuthorization();
在 launchSettings.json 我设置了这个:
"iisSettings":
"windowsAuthentication": true,
"anonymousAuthentication": false,
"iisExpress":
"applicationUrl": "http://localhost:23645",
"sslPort": 0
在 applicationhost.config 中:
<windowsAuthentication enabled="true">
<providers>
<add value="Negotiate" />
<add value="NTLM" />
</providers>
</windowsAuthentication>
这是我的控制器:
[HttpPost]
[Route("Search")]
[EnableCors("CorsPolicy")]
public IList<ToolbarSearchResultItem> Search(ToolbarSearch search)
//my code
这是控制台中的详细消息:请求 URL:http://localhost:23645/api/Toolbar/Search 请求方法:选项 状态码:401 未授权 远程地址:[::1]:23645 推荐人政策:strict-origin-when-cross-origin 缓存控制:私有 内容长度:6284 内容类型:文本/html;字符集=utf-8 日期:格林威治标准时间 2021 年 3 月 2 日星期二 15:52:05 服务器:Microsoft-IIS/10.0 WWW-认证:协商 WWW-认证:NTLM X-Powered-By: ASP.NET 接受:/ 接受编码:gzip、deflate、br 接受语言:fr-FR,fr;q=0.9,en-US;q=0.8,en;q=0.7 访问控制请求标头:内容类型 访问控制请求方法:POST 连接:保持活动 主机:本地主机:23645 来源:http://localhost:4200 参考:http://localhost:4200/ Sec-Fetch-Dest:空 Sec-Fetch-Mode: cors Sec-Fetch-Site:同一站点
这是我的 web.config
<?xml version="1.0" encoding="utf-8"?>
<configuration>
<location path="." inheritInChildApplications="false">
<system.webServer>
<handlers>
<add name="aspNetCore" path="*" verb="*" modules="AspNetCoreModuleV2" resourceType="Unspecified" />
</handlers>
<aspNetCore processPath=".\MYEXE.exe" stdoutLogEnabled="false" stdoutLogFile=".\logs\stdout" hostingModel="inprocess" />
</system.webServer>
</location>
</configuration>
我认为这不是真正的 CORS 块问题,而是配置问题或其他问题,与这个问题非常相似:Trouble with CORS Policy and .NET Core 3.1 但我使用了探查器并且没有 SQL 问题
【问题讨论】:
您必须知道在 CORS 中间件之前发生的任何事情(例如,如果您的应用程序在授权中间件期间崩溃)生成的响应将没有 CORS 标头,因此它将显示为来自浏览器的角度。您应该查看 ASP.NET 生成的日志(可能在输出窗口中)。如果您删除“EnableCors”属性,操作是否正确? 在输出窗口中我没有错误,我尝试删除“EnableCors”属性并且我有同样的错误。 "ConnectionStrings": "DefaultConnection": "data source=MyServer;initial catalog=DB;integrated security=True;MultipleActiveResultSets=True;App=EntityFramework;" , "Logging": "LogLevel": "Default": "Information", "Microsoft": "Warning", "Microsoft.Hosting.Lifetime": "Information" ,"AllowedHosts": "*"跨度> 从角度来看,您在 localhost:23645 上发送请求,但在 cors 中您使用的是 localhost:4200 。您需要使用相同的网址 localhost:4200 是 angular url,localhost:23645 是后端 url,Httpget 请求正常 【参考方案1】:从你的启动 Cors 配置中删除
.AllowCredentials();
并从控制器操作中移除
[EnableCors("CorsPolicy")]
但是您仍然有状态码:401。它与 Cors 无关。这只是关于授权。只需注释所有授权代码即可测试 CORS。在此之后,您可以开始授权。
【讨论】:
【参考方案2】:从源“http://localhost:4200”访问“http://localhost:23645/api/Toolbar/Search”处的 XMLHttpRequest 已被 CORS 策略阻止:对预检请求的响应未通过访问控制检查:请求的资源上不存在“Access-Control-Allow-Origin”标头。
请注意,CORS preflight request(使用 HTTP OPTIONS
方法)用于检查 CORS 协议是否被理解以及服务器是否知道使用具体的方法和标题。并且 HTTP OPTIONS
请求始终是匿名的,您启用了 Windows 身份验证并禁用了匿名访问,这将导致服务器无法正确响应预检请求。
要在本地运行您的应用以使用 CORS 进行测试,要解决此问题,您可以尝试启用匿名身份验证以允许匿名访问。
此外,如果您要将应用托管在 IIS 服务器上,要解决此问题,您可以安装 IIS CORS module 并为应用配置 CORS。
【讨论】:
我同意 Frei Hand 和 Sergey 的观点,我激活了匿名请求并且它有效!为了获取用户信息(这就是我之前只激活 Windows 身份验证的原因),我通过 Authorize Attribute 修饰了操作,并将其添加到 ConfigureServices 中: services.AddAuthentication(IISDefaults.AuthenticationScheme);我删除了这个: services.AddAuthorization(options => options.AddPolicy("AllUsers", policy => policy.RequireAuthenticatedUser()); );以上是关于.net core 3.1 中的 CORS 阻止了 Httppost 和 httpput的主要内容,如果未能解决你的问题,请参考以下文章
阻止对 ASP.NET Core 3.1 API 的服务器到服务器或 Postman 调用
在 .Net Core 3.1 的 Web Api 中无法使用 Cors [重复]
从 .NET Core 2.1 迁移到 v3.1 后出现“被 CORS 阻止”错误
即使在配置 ASP.NET Core Web API 中启用了 CORS,CORS 也会阻止发布请求