ASP.NET Core 2.2防止直接URL访问文档/文件

时间:2019-05-28 01:25:33

标签: c# asp.net asp.net-mvc asp.net-core

我在目录中存储了一堆文件。这些文件具有存储在数据库中的链接,例如

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'.

1 个答案:

答案 0 :(得分:1)

在app.UseStaticFiles()的默认配置中,仅提供wwwroot下的文件。如果直接提供该目录之外的文件,则说明您已从根文件夹为整个应用程序启用了静态文件,或者已在IIS上启用了目录浏览。您可以检查并禁用它们。

[更新] 当您使用UseStaticFiles()提供文件时,正常的中间件管道不会发出请求not方法。因此,您将无法使用常规的中间件功能,例如“身份验证/授权”。您可以有一个返回FileResult的存储库控制器,也可以有一个像the one here这样的自定义中间件。