在IIS上部署后,asp.net核心Web API上的CORS无法正常工作

时间:2020-02-04 14:18:01

标签: angular asp.net-core iis

我正在开发前端有角度的网络核心webapi。当我调试时一切正常,现在我已经在IIS上部署了Web abi,​​但我无法使其正常工作,它给了我CORS错误:"...No 'Access-Control-Allow-Origin' header is present on the requested resource."

以下是在Web api上启用CORS的代码:

public void ConfigureServices(IServiceCollection services)
{
...
    services.AddCors();

...
public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
...
    app.UseCors(x => x
        .AllowAnyOrigin()
        .AllowAnyMethod()
        .AllowAnyHeader());

我尝试了在此站点和其他站点中找到的不同解决方案,似乎没有任何作用

我应该在我的角度应用程序中添加某种标题吗? 问题可能出在IIS吗?

2 个答案:

答案 0 :(得分:0)

您可能想看看这个。

在您的Startup.cs文件中

// This method gets called by the runtime. Use this method to add services to the container.
      public void ConfigureServices(IServiceCollection services)
      {
           services.AddCors(cfg =>
           {
                cfg.AddDefaultPolicy(policy =>
                {
                     policy.WithOrigins("list of origins to allow here")
                     .AllowAnyHeader()
                     .AllowAnyMethod()
                     .AllowCredentials()
                     .SetIsOriginAllowed((_) => true)
                     .SetIsOriginAllowedToAllowWildcardSubdomains();
                });
           });


services.AddMvc()
                .AddJsonOptions(options =>
                {
                     options.SerializerSettings.ContractResolver = new CamelCasePropertyNamesContractResolver();
                     options.SerializerSettings.ReferenceLoopHandling = ReferenceLoopHandling.Ignore;
                     options.SerializerSettings.PreserveReferencesHandling = PreserveReferencesHandling.Objects;
                })
                .SetCompatibilityVersion(CompatibilityVersion.Version_2_2);
      }


public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory)
      {
         app.UseCors();
         app.UseMvc(routes =>
           {
                routes.MapRoute(
                     name: "default",
                     template: "{controller=Home}/{action=Index}/{tag?}");
           });
      }

请确保在调用MVC之前先调用Cors。

我希望这会有所帮助。

致谢

答案 1 :(得分:0)

我终于设法解决了这个问题: 我在IIS上启用了“基本身份验证”,因为我错误地认为这是正确的选择。

我发现IIS的“基本身份验证”与实现的方式不同(我创建了一个自定义的“ BasicAuthenticationHandler”,可以读取标头并验证用户身份)

问题是,即使启用了“匿名身份验证”,IIS(或我不知道的Angular或Chrome)也不返回错误“ 401未经授权”,这给了我CORS错误(必须禁用所有其他身份验证)