如何在 startup.cs 中添加 /.well-known/openid-configuration 路由以及控制器路由和 angular 路由?

How to add /.well-known/openid-configuration route in startup.cs along with controller routes and angular routes?

我正在使用 Identityserver4 创建登录服务器。我正在使用 ASP.net 核心 3.1 来实现功能,并使用 angular 9 项目来为 login/registeration 屏幕提供静态文件。 angular 项目正在从 .netcore 项目的 wwwroot 文件夹中提供服务。

为了确保我的 angular 路由与控制器路由一起正常工作,我在 Startup.cs

中添加了以下内容
    public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
    {
        app.UseCors(Constants.Constants.Policy);
        app.UseHttpsRedirection();
        app.UseRouting();
        app.UseAuthorization();
        app.UseIdentityServer();


        app.UseWhen(x => !x.Request.Path.Value.StartsWith("/Account"), builder =>
        {
            builder.Use(async (context, next) => {
                await next();
                if (context.Response.StatusCode == 404 && !Path.HasExtension(context.Request.Path.Value))
                {
                        context.Request.Path = "/index.html";
                        await next();
                }
            })
            .UseDefaultFiles(new DefaultFilesOptions { DefaultFileNames = new List<string>{"index.html"}})
            .UseStaticFiles();
        });

        app.UseEndpoints(endpoints =>
        {
             endpoints.MapControllerRoute(
                 name: "default",
                 pattern: "{controller=Account}/{action=Login}/{id?}");
        });
}

这确保当 url 包含 http://localhost:port/Account/Login 时,它将通过控制器路由提供服务。每隔 URL 条路径将通过 angular.

提供服务

当客户端应用程序尝试访问 http://localhost:port/.well-known/openid-configuration url 以获取发现文档时,就会出现问题。因为 URL 不是以 "Account" 开头,它是通过 angular 提供的,即它被重定向到 index.html 页面。

如何将 .well-known/openid-configuration 路由添加到我的 Startup.cs 以便它 returns 发现文档?

从客户端应用程序访问 IdentityServer 时出现的错误是

我在 IdentityServer 网页上得到的错误是

我不得不添加一个例外到路由 /.well-known 和 /Account

app.UseWhen(x => !x.Request.Path.Value.StartsWith("/Account") && !x.Request.Path.Value.StartsWith("/.well-known/openid-configuration") , builder =>
        {
            builder.Use(async (context, next) =>
            {
                await next();
                if (context.Response.StatusCode == 404 && !Path.HasExtension(context.Request.Path.Value))
                {
                    context.Request.Path = "/index.html";
                    await next();
                }
            })
                .UseDefaultFiles(new DefaultFilesOptions { DefaultFileNames = new List<string> { "index.html" } })
                .UseStaticFiles();
        });