从 3.1 升级后的 .NET Core 5.0 Azure 部署 CORS 问题

Posted

技术标签:

【中文标题】从 3.1 升级后的 .NET Core 5.0 Azure 部署 CORS 问题【英文标题】:.NET Core 5.0 Azure Deployment CORS Issue After Upgrade from 3.1 【发布时间】:2021-03-28 09:33:15 【问题描述】:

部署后,我的 Angular + .NET Core 应用程序出现 CORS 问题,我不确定如何解决。

当我尝试访问 API 端点时会出现以下消息,并且仅在我将版本从 3.1 升级到 5.0 后才会出现。

已被 CORS 政策阻止:对预检请求的响应未通过访问控制检查:请求的资源上不存在“Access-Control-Allow-Origin”标头。

让我感到困惑的是,这只发生在部署中,而不是本地。一切都在本地按预期工作。我究竟做错了什么?我在 API 端添加了 CORS 配置的 sn-p。

Startup.cs

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

        services.AddDbContext<DataContext>(x => x.UseInMemoryDatabase("TestDb"));
        services.AddMvc(options => options.EnableEndpointRouting = false);
        services.AddAutoMapper(typeof(Startup));
        services.AddSwaggerGen(c =>
        
            c.SwaggerDoc("v1", new OpenApiInfo
            
                Version = "v1",
            );
        );

        // configure strongly typed settings objects
        var appSettingsSection = Configuration.GetSection("AppSettings");
        services.Configure<AppSettings>(appSettingsSection);

        // configure jwt authentication
        var appSettings = appSettingsSection.Get<AppSettings>();
        var key = Encoding.ASCII.GetBytes(appSettings.Secret);
        services.AddAuthentication(x =>
        
            x.DefaultAuthenticateScheme = JwtBearerDefaults.AuthenticationScheme;
            x.DefaultChallengeScheme = JwtBearerDefaults.AuthenticationScheme;
        )
        .AddJwtBearer(x =>
        
            x.Events = new JwtBearerEvents
            
                OnTokenValidated = context =>
                
                    var loginService = context.HttpContext.RequestServices.GetRequiredService<ILoginService>();
                    var user = loginService.GetById(context.Principal.Identity.Name);
                    if (user == null)
                    
                        // return unauthorized if user no longer exists
                        context.Fail("Unauthorized");
                    
                    return Task.CompletedTask;
                
            ;
            x.RequireHttpsMetadata = false;
            x.SaveToken = true;
            x.TokenValidationParameters = new TokenValidationParameters
            
                ValidateIssuerSigningKey = true,
                IssuerSigningKey = new SymmetricSecurityKey(key),
                ValidateIssuer = false,
                ValidateAudience = false
            ;
        );

        // configure DI for application services
        services.AddScoped<ILoginService, LoginService>();
        services.AddScoped<IMenuService, MenuService>();
        services.AddScoped<IViewSettingsService, ViewSettingsService>();
        services.AddScoped<IActionService, ActionService>();
        services.AddScoped<IUserSettingsService, UserSettingsService>();
    

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


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

        app.Use(async (context, next) =>
        
            await next();

            if (context.Response.StatusCode == 404 && !Path.HasExtension(context.Request.Path.Value))
                                context.Request.Path = "/index.html";
                await next();
            

        );

        app.UseDefaultFiles();
        app.UseHttpsRedirection();
        app.UseAuthentication();
        app.UseMvc();
        app.UseSwagger();
        app.UseSwaggerUI(c =>
        
            c.SwaggerEndpoint("/swagger/v1/swagger.json", "Test API V1");
        );
    

【问题讨论】:

this is only happening in the deployment 什么意思?你在哪里部署应用程序?你能展示你完整的Configure方法吗? CORS 问题仅在我将应用程序部署到 azure 后发生。配置方法在代码中 @kjamp 您是否使用 Azure DevOps 进行部署? 是的,我正在使用 Azure DevOps 进行部署 @TM 不确定这是否会对您有所帮助,但我最终通过将应用服务计划中的设置更改为最新的 .net 框架版本来解决我的问题 【参考方案1】:

浏览器中的 CORS 错误通常会掩盖潜在的内部服务器错误。我的猜测是您正在运行 Windows 应用服务计划并且尚未切换到早期访问运行时:

https://azure.github.io/AppService/2020/11/10/Dot-Net-5-on-App-Service.html

https://github.com/Azure/app-service-linux-docs/blob/master/Runtime_Support/early_access.md

【讨论】:

尝试更改此设置,但仍有问题。【参考方案2】:

这个问题可能是因为你只在 API 端启用了 CORS,而没有在 Azure 存储上启用 CORS。

您可以点击this document查看如何为 Azure 存储启用 CORS。

【讨论】:

我在哪里可以找到这个?启用cors?文档有点混乱。我使用 azure devops 部署

以上是关于从 3.1 升级后的 .NET Core 5.0 Azure 部署 CORS 问题的主要内容,如果未能解决你的问题,请参考以下文章

Blog.Core开源快速升级.NET 6.0

.Net Core 3.1 和 .Net 5.0 是不是支持 XPath 2.0?

通过 ASP.NET Core 3.1/5.0 MVC 中的脚本使用选定的 ''value='' 填充数据库

[WebApi]ASP.Net Core 中使用JWT认证(3.1版本,5.0也可以使用)

[WebApi]ASP.Net Core 中使用JWT认证(3.1版本,5.0也可以使用)

将 ASP.NET Core 5.0 IdentityServer4 升级到 6.0 错误 - 没有这样的表:键