.NET CORE 2.1 中的 CORS - 简单配置不返回标头

Posted

技术标签:

【中文标题】.NET CORE 2.1 中的 CORS - 简单配置不返回标头【英文标题】:CORS in .NET CORE 2.1 - no header returned for simple configuration 【发布时间】:2018-12-02 06:44:23 【问题描述】:

我基本上遵循了这个文档:https://docs.microsoft.com/en-us/aspnet/core/security/cors?view=aspnetcore-2.1 试图在我的项目中正确设置它,但到目前为止还没有缺乏。我想我尝试了每一种组合,包括中间和服务、更改顺序等。

使用邮递员进行测试时,在对我的 API 端点进行 POST 调用时,我看不到任何与 CORS 相关的标头。

我正在使用 API 并在 http:/localhost:3000 上运行的应用在尝试对 API 端点进行 POST 调用时出现 CORS 错误。

这是我的整个Startup.cs 课程:

public class Startup

    public Startup(IHostingEnvironment hostingEnvironment, IConfiguration configuration)
    
        HostingEnvironment = hostingEnvironment;
        Configuration = configuration;
    

    public IConfiguration Configuration  get; 
    public IHostingEnvironment HostingEnvironment  get; 

    // This method gets called by the runtime. Use this method to add services to the container.
    public void ConfigureServices(IServiceCollection services)
    
        services.AddInjectionByAttribute();

        services.AddDbContext<MoneyTrackigContext>(options =>
            options.UseSqlServer(Configuration.GetConnectionString("DefaultConnection")));
        services.AddDbContext<UserContext>(options =>
            options.UseSqlServer(Configuration.GetConnectionString("UserDbConnection")));                       

        services.AddIdentity<IdentityUser, IdentityRole>(o =>
        
            o.Password.RequireDigit = false;
            o.Password.RequiredLength = 6;
            o.Password.RequireLowercase = false;
            o.Password.RequireNonAlphanumeric = false;
            o.Password.RequireUppercase = false;
        )
        .AddEntityFrameworkStores<UserContext>()
        .AddDefaultTokenProviders();

        JwtSecurityTokenHandler.DefaultInboundClaimTypeMap.Clear(); // => remove default claims
        services.AddAuthentication(o =>
        
            o.DefaultAuthenticateScheme = JwtBearerDefaults.AuthenticationScheme;
            o.DefaultScheme = JwtBearerDefaults.AuthenticationScheme;
            o.DefaultChallengeScheme = JwtBearerDefaults.AuthenticationScheme;
        )
        .AddJwtBearer(cfg =>
        
            cfg.RequireHttpsMetadata = HostingEnvironment.IsDevelopment();
            cfg.SaveToken = true;
            cfg.TokenValidationParameters = new TokenValidationParameters
            
                ValidIssuer = Configuration.GetSection("JwtOptions")["JwtIssuer"],
                ValidAudience = Configuration.GetSection("JwtOptions")["JwtIssuer"],
                IssuerSigningKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(Configuration.GetSection("JwtOptions")["JwtKey"])),
                ClockSkew = TimeSpan.Zero // remove delay of token when expire
            ;
        );

        services.AddAuthorization(o =>
        
            o.AddPolicy(Policy.DefaultUser, policy => policy.RequireClaim(ClaimName.User));
        );

        services.AddAutoMapper();

        services.AddCors();
        services.AddMvc();

    

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

        app.UseAuthentication();
        app.UseCors(b => b.WithOrigins("http:/localhost:3000").AllowAnyHeader().AllowAnyMethod());
        app.UseMvc();
    

我是否遗漏了一些明显的东西?任何可能导致此问题的想法。整个事情看起来很简单,但被卡住了。

【问题讨论】:

对于遇到此问题的任何人,在设置原点的“b.WithOrigins”中的协议中缺少一个斜线。 【参考方案1】:

您需要在 Postman 中添加一个 Origin 标头才能获得相应的响应。

【讨论】:

【参考方案2】:

找到原因了。 .NET CORE 不会附加 CORS 标头,以防出现应用程序异常并且无法正确处理请求。所以 API 返回 500 没有 CORS 标头,浏览器将其处理为 CORS 错误,而不是 api 错误,这就是我错过它的原因。 有问题的配置工作正常

【讨论】:

以上是关于.NET CORE 2.1 中的 CORS - 简单配置不返回标头的主要内容,如果未能解决你的问题,请参考以下文章

AWS ASP.NET Core 2.1 和带角度的 CORS

ReactJS/ASP.Net Core 2.1 版本 CORS 错误

asp.net core 2.1 跨域策略。添加为 CORS 时,只有单个 url 有效

在 ASP .NET Core 2.1 Web Api 中启用 CORS

从 .NET Core 2.1 迁移到 v3.1 后出现“被 CORS 阻止”错误

基于 .Net Core 中的 appSettings 使用 Cors