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

时间:2016-04-21 16:50:23

标签: 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中的位置?
  4. 非常感谢!

5 个答案:

答案 0 :(得分:22)

是的,他们应该进入wwwroot。目前没有内置的方法来保护wwwroot目录。但创建一个中间件模块来完成它是非常简单的。有一个易于学习的教程here

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

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

答案 1 :(得分:8)

<。>在.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");
}

基于以下答案(针对.netCore):static file authorization

答案 2 :(得分:1)

这是一个非常简单的示例,但可以更改它以检查特定角色,并且可以将代码移出Startup.cs以获得更大的灵活性。

app.Use(async (context, next) =>
               {
                   if (!context.User.Identity.IsAuthenticated
                       && context.Request.Path.StartsWithSegments("/excelfiles"))
                   {
                       throw new Exception("Not authenticated");
                   }
                   await next.Invoke();
               });

答案 3 :(得分:1)

如果您具有登录表单(Login.html),则简单的解决方案是:如果用户未通过身份验证并且他正在请求受保护的资源(/ protected文件夹下的文件),则将用户重定向到登录页面。在Startup.cs的Configure方法中,插入以下代码:

app.Use(async (context, next) =>
{
    if (!context.User.Identity.IsAuthenticated && context.Request.Path.StartsWithSegments("/protected"))
    {
        context.Response.Redirect("/Login.html");
        return;
    }
    await next.Invoke();
});

答案 4 :(得分:1)

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

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