解释
我有一个主网站:https://example.com,使用 .Net 8.0 Razor Pages 构建。
我想在启动时创建(如果不存在)acme-challenge 文件夹
当 ID 被发送到 acme-challenge url 时,
它会在 acme-challenge 文件夹中创建一个具有该 ID 的文件。
通过遵循许多网站教程,我已经成功完成了这一点。
当我向挑战传递随机 ID 时,我收到如下所示的错误(文件不存在)。
如果文件存在,它就会读取该文件,就可以了。
我不明白这个功能缺少什么。
问题
如何正确完成此操作,使其发挥作用?
我尝试过的代码: 在Program.cs中:
app.UseStaticFiles();
app.UseStaticFiles(new StaticFileOptions
{
FileProvider = new PhysicalFileProvider(Path.Combine(Directory.GetCurrentDirectory(), @".well-known")),
RequestPath = new PathString("/.well-known"),
ServeUnknownFileTypes = true // serve extensionless file
});
// 处理让加密路由(在 MVC 处理之前!)
app.UseRouter(r =>
{
r.MapGet(".well-known/acme-challenge/{id}", async (request, response, routeData) =>
{
var id = routeData.Values["id"] as string;
var file = Path.Combine(Directory.GetCurrentDirectory(), ".well-known", "acme-challenge", id);
await response.SendFileAsync(file);
});
});
app.UseRouting();
在WEBNET8.proj上:
诗。由于不知道哪一种有效,我尝试了多种组合。如下。
<ItemGroup>
<Content Include="wwwroot\.well-known\**">
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
</Content>
<Folder Include="wwwroot\.well-known\acme-challenge\" />
<Content Include=".well-known\acme-challenge\**">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</Content>
</ItemGroup>
我得到的错误:
fail: Microsoft.AspNetCore.Server.Kestrel[13]
Connection id "0HN8GK882NCBE", Request id "0HN8GK882NCBE:00000021": An unhandled exception was thrown by the application.
System.IO.FileNotFoundException: Could not find file 'D:\source\repos\WEBNET8\WEBNET8\WEBNET8\.well-known\acme-challenge\ftf75rf7t7rfvovr8oiv8o'.
File name: 'D:\source\repos\WEBNET8\WEBNET8\WEBNET8\.well-known\acme-challenge\ftf75rf7t7rfvovr8oiv8o'
at System.IO.FileInfo.get_Length()
实际上你的代码片段按照设计工作:你从不检查
.well-known/acme-challenge
中的文件是否存在,你盲目地尝试发送文件内容,记录的错误是逻辑结果。
您在
app.UseRouter
中所做的事情是一个非常糟糕的想法:潜在的攻击者通过在../../else-notaccessible.conf
参数中提交诸如id
之类的内容来读取您服务器上的任意文件(至少在wwwroot下)。