c# - ASP.NET Core 2.2 防止对文档/文件的直接 URL 访问
问题描述
我有一堆文件存储在一个目录中。这些文件的链接存储在数据库中,例如
https://localhost:44325/Repositories/Aopdio/2019/05/QWNjb3VX0FNT1NUSElSRF9LTA==.pdf
当我登录到我的应用程序时,我可以通过应用程序访问文件。但是,当我复制此链接并将其粘贴到另一个浏览器中时,该文件仍会打开。
有没有办法防止这种情况发生?我希望仅从应用程序中提供内容。
这是我的startup.cs
app.UseStaticFiles();
app.UseStaticFiles(new StaticFileOptions
{
FileProvider = new PhysicalFileProvider(RepositoryManager.GetBasePath(Environment.GetEnvironmentVariable("APPONE_REPOSITORY"))),
RequestPath = RepositoryManager.GetRequestPath(Environment.GetEnvironmentVariable("APPONE_REPOSITORY"))
});
app.UseStaticFiles(
new StaticFileOptions
{
FileProvider = new PhysicalFileProvider(
Path.Combine(Directory.GetCurrentDirectory(), "wwwroot", "Resources")),
RequestPath = "/Resources"
}
);
这是我尝试实现的中间件:
在 Startup.cs
app.UseRequestMiddleware();
中间件
public class RequestMiddleware
{
private readonly RequestDelegate next;
public RequestMiddleware(RequestDelegate next)
{
this.next = next;
}
public async Task Invoke(HttpContext context, Func<Task> next)
{
var test = context;
}
}
调用中间件并在 Startup.cs 中调用的扩展
public static class RequestMiddlewareExtension
{
public static IApplicationBuilder UseRequestMiddleware(this IApplicationBuilder builder)
{
return builder.UseMiddleware<RequestMiddleware>();
}
}
}
但是,我收到此错误:
InvalidOperationException: Unable to resolve service for type 'System.Func`1[System.Threading.Tasks.Task]' while attempting to Invoke middleware 'App.ClassLibrary.Middleware.RequestMiddleware'.
解决方案
在 app.UseStaticFiles() 的默认配置中,仅提供 wwwroot 下的文件。如果直接提供该目录之外的文件,则要么您已从根文件夹为整个应用程序启用静态文件,要么您已在 IIS 上启用目录浏览。您可以检查和禁用它们。
[更新] 当您使用 UseStaticFiles() 提供文件时,请求不方法不会通过正常的中间件管道。所以你不能拥有像 Authenticate/Authorize 这样的常规中间件功能。您可以拥有一个返回 FileResult 的存储库控制器,或者您可以拥有一个像这里这样的自定义中间件。
推荐阅读
- reactjs - 是否可以将道具从 React Link 传递到功能组件?
- paypal - 已解决 - 我的 PayPal 支付数据传输 (PDT) 身份令牌在哪里?2020
- progressive-web-apps - 独立的Web应用程序,当应用程序从后台返回时相机是黑色的?
- javascript - 从 API Node JS 获取不正确的数据
- c# - 如何使用 python .Net vs ZeroMQ 或其他方法将 Python 包公开给 C#
- excel - vba如何检查过滤器是否给出结果(可见属性包括标题)
- mysql - docker-compose 的“db”服务中 MYSQL_PASSWORD 的插值格式错误
- android - Android:更换片段时如何停止音乐?
- python - 在 Django 中为我的 PostgreSQL 连接设置纯文本密码是否安全?
- javascript - 如何使用 for 循环进行绑定