Identity Server 4 没有为 `.well-known/openid-configuration` 设置`Access-Control-Allow-Origin`

Posted

技术标签:

【中文标题】Identity Server 4 没有为 `.well-known/openid-configuration` 设置`Access-Control-Allow-Origin`【英文标题】:Identity Server 4 not setting `Access-Control-Allow-Origin` for `.well-known/openid-configuration` 【发布时间】:2020-11-22 01:31:14 【问题描述】:

政策生成器:

        private CorsPolicy GenerateCorsPolicy()
        
            var corsBuilder = new CorsPolicyBuilder();
            corsBuilder.AllowAnyHeader();
            corsBuilder.AllowAnyMethod();
            corsBuilder.AllowAnyOrigin();
            return corsBuilder.Build();
        

向容器添加策略

            services.AddCors(
                options =>
                
                    options.AddPolicy("AllowAllOrigins", GenerateCorsPolicy());
                );

告诉 Identity Server 使用此策略:

                        options.Events.RaiseErrorEvents = true;
                        options.Events.RaiseInformationEvents = true;
                        options.Events.RaiseFailureEvents = true;
                        options.Events.RaiseSuccessEvents = true;
                        options.Cors.CorsPolicyName = "AllowAllOrigins";

配置应用程序的其余部分也使用此策略:

            app.UseRouting();

            app.UseIdentityServer();

            app.UseAuthorization();

            app.UseEndpoints(
                endpoints =>
                
                    endpoints.MapControllers();
                    endpoints.MapRazorPages();
                    endpoints.MapControllerRoute(
                        name: "default",
                        pattern: "controller=Home/action=Index/id?");
                );
            app.UseStaticFiles();

            app.UseCors("AllowAllOrigins");

标题未设置:

【问题讨论】:

【参考方案1】:

您可以使用客户端定义中的 AllowedCorsOrigins 属性单独控制 IdentityServer 中的 CORS:

        AllowedCorsOrigins =
        
            "https://localhost:5001"
        

你的管道看起来也有点奇怪:

        app.UseStaticFiles();
        app.UseCors("AllowAllOrigins");

在您的情况下,我看不出有任何理由在 UseEndpoints 中间件之后添加中间件。

管道如下所示,您的传入请求通过此管道进行处理,每个中间件都可以对请求执行操作,如下所示:

【讨论】:

嗯,如果没有效果,那么设置这个CorsPolicyName 有什么意义呢?顺便说一句,你的建议奏效了,我只是觉得很奇怪...... 因为您在管道中最后使用了 UseCors,所以它可能根本不会受到打击。您总是可以尝试在管道中更早地添加它。也可能是 IdentityServer 会完全阻止 CORS 请求,因为它们会违反客户端定义中的 CORS-URL。 好的,那我想我还不明白如何正确设置管道...感谢您的帮助:) 添加了一张图片(来自我的一个培训课程),说明如何推断管道和每个应用程序。UseXXX() 按顺序向此管道添加一个项目。

以上是关于Identity Server 4 没有为 `.well-known/openid-configuration` 设置`Access-Control-Allow-Origin`的主要内容,如果未能解决你的问题,请参考以下文章

为啥 acr_values 没有传递给 Identity Server 4 上的 POST /connect/token?

有没有办法撤销另一个用户的访问令牌并结束他们在 Identity Server 4 中的会话?

React Template w/Identity Server not working in .NET 6 - Bearer error The issuer is invalid

ASP.NET 核心 blazor webassembly 为 Identity Server 4 Postman 测试获取令牌

Identity Server 4 身份验证太慢

学习Identity Server 4的预备知识