首页 > 解决方案 > 托管 .well-known/openid-configuration 的正确方法是什么?

问题描述

我有一个基于 ASP.NET Core 5 的 Blazor 服务器项目。我想托管自己的 openid 配置发现文件。由于此文件是在运行 OIDC 工作流程时提供的,因此我想验证托管此文件的正确方法是什么。到目前为止,我已经尝试了以下方法,并且只有选项 2 有效。

  1. 使用 wwwroot/.well-known

这涉及在我的 blazor 服务器项目的 wwwroot 文件夹中静态托管 openid 配置文件。

在此处输入图像描述

在此之后,如果我运行他的项目并尝试使用 localhost:44382/.well-known/openid-configuration 访问该文件,则不会提供该文件。

  1. 使用控制器

为此,我只是在我的 blazor 项目中添加了一个简单的控制器,并将 .well-known/openid-configuration 指定为我的匿名控制器 HTTPGET 操作的路由。

public class OidcConfigurationController : Controller
{      

    [HttpGet(".well-known/openid-configuration")]
    public JsonResult OpenIdConfiguration()
    {
        return Json(new Storage.Storables.Security.OIDC.Configuration());
    }   
}

现在,如果我使用选项 2 运行项目并尝试访问 localhost:44382/.well-known/openid-configuration,则配置 JSON 将正确提供。

在此处输入图像描述

选项 2 是使用 ASP.NET Core 和 Blazor 服务器项目提供 OpenId-Configuration 的正确方法吗?如果我发布服务器(例如到​​ Azure)会导致任何问题

标签: asp.net-coreoauth-2.0blazoropenid-connectblazor-server-side

解决方案


您的第一种方法不起作用的原因是您没有以静态文件扩展名假设的方式提供静态文件。您缺少文件结尾,否则,请求不会被识别为文件。

也就是说,您可以编写自己的中间件。给文件一个合适的结尾,比如 .json。如果/.well-known/openid-configuration/请求资源,则将请求的路径更改为/.well-known/openid-configuration.json并让静态文件扩展名处理其余部分。

public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
            ...
          

            app.Use(async (context, next) =>
            {
                if (context.Request.Path == "/.well-known/openid-configuration")
                {
                    context.Request.Path = "/.well-known/openid-configuration.json";
                }
           
                await next();
            });

            app.UseStaticFiles();

            ...
}

有关编写中间件的更多信息,请查看文档https://docs.microsoft.com/en-us/aspnet/core/fundamentals/middleware/write

但是,您遇到了问题-我猜-因为大多数情况下,此文档是根据您的开放 id 连接服务器(如 IdentityServer)的配置动态生成的。那么,也许静态文件周围有问题?


推荐阅读