IdentityServer 4 中的 CORS 问题

Posted

技术标签:

【中文标题】IdentityServer 4 中的 CORS 问题【英文标题】:CORS issue in IdentityServer 4 【发布时间】:2020-11-04 15:34:47 【问题描述】:

我使用 IdentityServer 4 作为我的应用程序的 oauth (Reactjs) 我在端口 http://localhost:5000 上运行 Identityserver,在 http://localhost:3000 上运行 reactjs 应用程序。我已经尝试通过以下代码为我的 identityserver4 使用 CORS。

    public void ConfigureServices(IServiceCollection services)
    
   
        services.AddIdentityServer(options =>
        
            options.Events.RaiseSuccessEvents = true;
            options.Events.RaiseFailureEvents = true;
            options.Events.RaiseErrorEvents = true;
        )
            
            .AddClientStore<ClientStore>()
            //.AddInMemoryApiResources(Config.GetApiResources())
            .AddResourceStore<ResourceStore>()
            //.AddInMemoryClients(Config.GetClients())
            .AddCustomUserStore()
           .AddCertificateFromFile();

        
        services.AddCors(options =>
        
            options.AddPolicy("CorsPolicy",
                builder => builder.WithOrigins( "http://localhost:3000/")
                .AllowAnyMethod()
                .AllowAnyHeader());
        );


    

    public void Configure(IApplicationBuilder app, IWebHostEnvironment environment)
    
        
        
        app.UseForwardedHeaders();
        if (environment.IsDevelopment())
        
            app.UseDeveloperExceptionPage();
        
        app.UseCors("CorsPolicy");
        //app.UseCors("default");
        app.UseIdentityServer();

        app.UseStaticFiles();
        // uncomment, if you want to add an MVC-based UI
        app.UseMvcWithDefaultRoute();
    

即使我在 WithOrigins() 中添加了 localhost:3000,当我尝试使用 axios 从 react app 发出请求时,我收到以下阻塞错误。

谁能帮我知道我做错了什么。我需要我的应用程序只允许一些来源列表(应用程序) 谢谢

【问题讨论】:

您能否发布整个 Startup.cs,因为中间件的顺序也很重要? 尝试只使用 AllowAnyOrigin() 而不使用 WithOrigins("localhost:3000/") @zhuber 我已经更新了代码你现在可以看到订单了 @foadabd 我只希望 localhost:3000 访问身份服务器,因此 AllowAnyOrigin() 对我不起作用。 @p.durgashankar 好的尝试只使用 WithOrigins("localhost:3000/") 没有 AllowAnyOrigin() 并且可能需要 AllowCredentials() 【参考方案1】:

这可能是因为尾部斜线,这在the documentation 中有所提及。

注意:指定的 URL 不能包含尾部斜杠 (/)。如果 URL 以 / 结尾,则比较返回 false 并且不返回任何标头。

尝试使用http://localhost:3000 而不是http://localhost:3000/

我还质疑.AllowAnyOrigin().WithOrigins() 的用法。仅使用 .WithOrigins() 即可实现您想要实现的目标。

【讨论】:

删除斜杠后它正在工作:) 谢谢你拯救了我的一天【参考方案2】:

如果您要向另一个域发送请求,请尝试从您的身份服务器而不是 react.js 应用程序发送 http 请求。我遇到了类似的问题,但我只是将我的 API 用作代理,它运行良好。

【讨论】:

以上是关于IdentityServer 4 中的 CORS 问题的主要内容,如果未能解决你的问题,请参考以下文章

Identity Server 4 CORS 未配置

IdentityServer4 CORS 问题

IdentityServer4中自定义控制器和CustomClientStore的CORS问题

在 IdentityServer3 中处理 CORS 之前发送的飞行前 OPTIONS 请求

路径不适用于 Blazor 中允许的 IdentityServer CORS 端点,但适用于 Postman

Cors Policy 问题 Blazor WASM、Web API 和 Identity Server 4 和 IIS