如何仅向授权用户提供静态文件?

Gab*_*abe 25 c# asp.net-core asp.net-core-staticfile

我有一组Excel电子表格,我只想在授权用户的ASP.NET 5 webapp中提供这些电子表格.

  1. 我应该在哪里存储文件?我假设在wwwroot(例如,wwwroot/files).
  2. 如果在wwwroot中,如何仅允许授权用户访问?(我想将它们作为来自控制器的[Authorize] FileResult提供,但是这仍然保持文件可以通过我认为的URL直接访问.)
  3. 如何通过控制器中的FileResult操作引用wwwroot中的位置?

非常感谢!

Cli*_*t B 26

是的,他们应该进去wwwroot.目前没有内置的方法来保护wwwroot目录.但创建一个中间件模块来完成它是非常简单的.有一个简单的按照教程这里.

如果你不熟悉开发中间件,我发布了一个GitHub项目,它展示了如何通过三个简单的步骤创建中间件.您可以在此处下载该项目.

您不需要控制器来访问静态文件.

  • 或者你可以把它们放在wwwroot的*之外,静态文件中间件不会触及.就像一个很好的旧App_Data文件夹(诚然,你必须自己创建) (7认同)
  • 实际上,让我更清楚一点,您绝对不应该*不要*将它们放在wwwroot下,因为存在静态文件中间件将对它们进行处理的风险,因为它打算对它了解的wwwroot下的任何文件进行处理。如果您弄乱了中间件订单,则将东西放在wwwroot下可能会带来巨大的信息泄露风险。 (2认同)

Guy*_*Guy 9

在.net核心中创建一个与wwwroot相同级别的专用目录www,并使用以下代码:

public HomeController(IHostingEnvironment hostingEnvironment)
{
    _hostingEnvironment = hostingEnvironment;
}

[Authorize(Roles = "SomeRole")]
public IActionResult Performance()
{
    return PhysicalFile(Path.Combine(_hostingEnvironment.ContentRootPath,
                                     "www", "MyStaticFile.pdf"), "application/pdf");
}
Run Code Online (Sandbox Code Playgroud)

基于以下答案(针对.netCore):静态文件授权

  • 此处还进行了描述:[ASP.NET Core 中的静态文件:静态文件授权](https://docs.microsoft.com/en-us/aspnet/core/fundamentals/static-files?view=aspnetcore-3.1#static-文件授权) (3认同)

小智 6

在检索文件时进行身份验证检查:

        app.UseStaticFiles(new StaticFileOptions()
        {
            OnPrepareResponse = (context) =>
            {
                if (!context.Context.User.Identity.IsAuthenticated && context.Context.Request.Path.StartsWithSegments("/excelfiles"))
                {
                    throw new Exception("Not authenticated");
                }
            }
        });
Run Code Online (Sandbox Code Playgroud)

  • 仅当使用的身份验证方案是默认身份验证方案时,这才有效,否则 `HttpContext.User` 将不会更新(请参阅[此问题](https://github.com/aspnet/Security/issues/1318)) 。 (2认同)