如何解决 IIS 服务器上的 cors 错误

Posted

技术标签:

【中文标题】如何解决 IIS 服务器上的 cors 错误【英文标题】:How to troubleshoot cors error on IIS server 【发布时间】:2021-11-30 09:22:29 【问题描述】:

我正在开发一个应用程序,其后端是带有 SignalR 的网络核心 API,前端是 Angular。在我的计算机上调试它按预期工作,但是当我在服务器上发布时,即使在 startup.cs 上启用它们后,它也会显示 Cors 错误。

这是我得到的错误: 从源“http://server”访问“http://server:10079/fareg/api/account”处的 XMLHttpRequest 已被 CORS 策略阻止:没有“Access-Control-Allow-Origin”标头请求的资源。

谁能帮助确定我做错了什么来解决 CORS 错误?

    public void ConfigureServices(IServiceCollection services)
    
        services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_1);

        //add Windows authentication for http options request
        services.AddAuthentication(IISDefaults.AuthenticationScheme);
        services.AddMvc(config =>
        
            var policy = new AuthorizationPolicyBuilder()
                .RequireAuthenticatedUser()
                .Build();
            config.Filters.Add(new AuthorizeFilter(policy));
        );

        services.AddDbContext<FAContext>(options =>
            options.UseSqlServer(Configuration.GetConnectionString("FADB")));

        services.AddCors(options =>
        
            options.AddPolicy(name: _MyCors, builder =>
            
                builder
                    .SetIsOriginAllowed(origin => new Uri(origin).Host == "server name")
                    //.WithOrigins("http://server/fareg", "http://localhost:4200")
                    .AllowCredentials()
                    .AllowAnyHeader()
                    //.SetIsOriginAllowed(_ => true)
                    .AllowAnyMethod();
            );
        );

        services.AddSignalR().AddMessagePackProtocol();
    

    // This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
    public void Configure(IApplicationBuilder app, IHostingEnvironment env)
    
        app.UseCors(_MyCors);

        if (env.IsDevelopment())
        
            app.UseDeveloperExceptionPage();
        
        else
        
            app.UseHsts();
        

        app.UseHttpsRedirection();
        

        app.UseSignalR(routes =>
       
           routes.MapHub<Hubs.HubFA>("/signalr");
       );

        app.UseMvc();
    

【问题讨论】:

如果您启用了 Windows 身份验证并使用 IIS,最简单的选择是使用 IIS CORS 模块来允许预检请求。 【参考方案1】:

你把 UseCors() 放在了错误的地方。尝试使用这种语法


public void ConfigureServices(IServiceCollection services)
        
            services.AddCors(o => o.AddPolicy(_MyCors,
                      builder =>
                       
                       builder.AllowAnyOrigin()
                              .AllowAnyMethod()
                              .AllowAnyHeader();
              ));

        .....
            
        

        
        public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
        
            .....

           // app.UseRouting();

            app.UseCors(_MyCors);

         //  app.UseAuthorization();
         // app.UseEndpoints(..
 
         

确保 UseCors 应该在 Configure 方法的末尾,但在 UseAuthorizaton 之前。在您的情况下,它应该在 UseMvc() 之上。但是应该将 AddCors 移到配置服务的顶部。

如果此语法适合您,则只有在此之后您才能尝试添加 useorigin。

【讨论】:

以上是关于如何解决 IIS 服务器上的 cors 错误的主要内容,如果未能解决你的问题,请参考以下文章

如何解决本地系统上的 Cors 问题?

如何在 Windows 10 的 IIS 管理器上启用 CORS?

IIS 上的 Net Core Cors 和 Angular 应用程序

如何解决 Fetch API js 中的 CORS 错误

如何解决不受信任的证书错误?(TFS2013 Build and deploy to IIS)

实战,SpringBoot中如何解决CORS跨域问题~(文末送书)