首页 > 解决方案 > 如何在 startup.cs 中添加 /.well-known/openid-configuration 路由以及控制器路由和角度路由?

问题描述

我正在使用 Identityserver4 创建登录服务器。我正在使用 ASP.net core 3.1 来提供功能,并使用 angular 9 项目来为登录/注册屏幕提供静态文件。从 .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 以便它返回发现文档?

从客户端应用程序访问 IdentityServer 时出现的错误是在此处输入图像描述

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

在此处输入图像描述

标签: c#asp.net-coreidentityserver4openid-connect

解决方案


我必须添加一个例外来路由 /.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();
        });

推荐阅读