Asp.net Core、JWT 和 CORS 标头

Jos*_*ale 5 cors oauth-2.0 asp.net-core

当我在同一服务上同时启用 JWT 承载身份验证和 CORS 时,我在从服务器获取适当的 Access-Control-Allow-Origin 标头时遇到问题。当我从配置中删除 UseJwtBearerAuthentication 时,一切正常。

public void ConfigureServices(IServiceCollection services)
    {
        services.AddCors(options =>
        {
            options.AddPolicy("AllowAllOrigins", builder =>
            {
                builder.AllowAnyOrigin();
                builder.AllowAnyHeader();
                builder.AllowAnyMethod();
                builder.AllowCredentials();
            });
        });

        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, ILoggerFactory loggerFactory)
    {
        loggerFactory.AddConsole(Configuration.GetSection("Logging"));
        loggerFactory.AddDebug();

        app.UseJwtBearerAuthentication(options =>
        {
            options.AutomaticAuthenticate = true;
            options.RequireHttpsMetadata = false;
            options.Audience = "c2cf422a-a432-2038-b183-cda64e16239e";
            options.Authority = "domain.com";
        });

        app.UseCors("AllowAllOrigins");

        app.UseIISPlatformHandler();

        app.UseMvc();
    }
Run Code Online (Sandbox Code Playgroud)

我试图更改配置的顺序,但似乎没有任何效果。我还尝试将 [EnableCors("AllowAllOrigins")] 添加到我正在调用的控制器中。

我已经根据评论中的建议更改了配置顺序,并确定了导致问​​题的属性:

app.UseIISPlatformHandler();

        app.UseCors("AllowAllOrigins");

        app.UseJwtBearerAuthentication(options =>
        {
            options.AutomaticAuthenticate = true;
            options.RequireHttpsMetadata = false;
            options.Audience = "c8cf662a-ac73-4050-b285-cda90e22992e";
            options.Authority = "iwdwk.com";
        });

        app.UseMvc();
Run Code Online (Sandbox Code Playgroud)

在上面的代码中,下面的行似乎导致了问题:

options.AutomaticAuthenticate = true;
Run Code Online (Sandbox Code Playgroud)

不幸的是,我需要启用它,以便我可以通过 JWT 令牌进行授权......除非有另一种方法可以做到这一点?

小智 1

我猜想,来自浏览器的 OPTIONS 调用会被身份验证拒绝,因为它们可能不包含不记名令牌。我不确定,但在调用 UseJwtBearerAuthentication 时必须有一种方法可以跳过 OPTIONS 调用的身份验证。如果您想在此之前确认这一点,请尝试从邮递员调用您的端点,因为它会跳过 OPTIONS 调用并查看您是否获得实际 GET/POST 调用的访问控制标头