asp.net-core - 托管 .well-known/openid-configuration 的正确方法是什么?
问题描述
我有一个基于 ASP.NET Core 5 的 Blazor 服务器项目。我想托管自己的 openid 配置发现文件。由于此文件是在运行 OIDC 工作流程时提供的,因此我想验证托管此文件的正确方法是什么。到目前为止,我已经尝试了以下方法,并且只有选项 2 有效。
- 使用 wwwroot/.well-known
这涉及在我的 blazor 服务器项目的 wwwroot 文件夹中静态托管 openid 配置文件。
在此之后,如果我运行他的项目并尝试使用 localhost:44382/.well-known/openid-configuration 访问该文件,则不会提供该文件。
- 使用控制器
为此,我只是在我的 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)会导致任何问题
解决方案
您的第一种方法不起作用的原因是您没有以静态文件扩展名假设的方式提供静态文件。您缺少文件结尾,否则,请求不会被识别为文件。
也就是说,您可以编写自己的中间件。给文件一个合适的结尾,比如 .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)的配置动态生成的。那么,也许静态文件周围有问题?
推荐阅读
- python - 通过使用字符串格式连接其他两个列来创建一个新列
- spring-boot - 如何返回文件和对象,其中包含有关 Spring 中文件的一些信息?
- asp.net-mvc - 在 ASP.NET MVC 项目中刷新后,React 链接页面变为 404
- node.js - 如何避免 Outlook 的自动换行删除?
- php - 如何从 Google OAuth 获取附加参数?
- c# - 中间件抛出的异常没有被记录(.UseExceptionHandler?)
- shiny - 使闪亮仪表板的选项卡文本字体加粗
- c# - 在 Windows 窗体 C# 应用程序的配置文件中设置值
- firebase - 配置默认 Firebase 应用 __FIRAPP_DEFAULT
- marklogic - 我们可以加密 httpget 上的凭据吗