.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 也会阻止发布请求

C# Net Core:在 API 中启用 Cors 后,仍处于 CORS 策略阻止状态

CORS预检请求被阻止.Net Core 2.2 [重复]