在ASP Net Core 2.0中为带有身份验证的静态文件夹提供服务

时间:2019-06-11 05:59:37

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

我正在将ASP Net Core 2.0.5与MVC一起使用,并希望在wwwroot之外提供一个静态文件夹。

我的输入文件如下所示。

wwwroot
staticfolder
    10
        index.html
        image1.png
        image2.png
        sub-folder
            image3.jpg

index.html由其他程序生成。所有图像都在index.html中使用。

我们希望在验证通过后进入服务器,即用户可以通过路径index.html查看api/flight/10/index.html。但是我需要检查用户访问资源flight 10的权限。

我知道Physicalfile可用于在wwwroot之外提供静态文件(例如* .png),也可将app.UseStaticFiles配置为在startup.cs中提供文件夹和文件。

一些伪代码为最小示例。

[Route("api/flight/{flight}/index.html")]
[HttpGet]
public IActionResult GetImageThumbnail(
    [FromRoute] int flight)
{
    // Check permission
    List<Flight> data = _context
        .Flight(id: flight)
        .ToList();

    if (data.Count() == 0)
    {
        return NotFound("No permission.");
    }

    // data[0].BaseFolder is a folder outside wwwroot
    string filename = data[0].BaseFolder + "/index.html";
    // Return the content for index.html
    ...
}

所以我的问题是我应该如何使用上面类似的方法来处理混合了html和图像的文件夹。

1 个答案:

答案 0 :(得分:0)

我找到了实现目标的简单解决方案。如果其他人有相同的问题,请在此处发布。

关键是要使用{*file}设置Route,它会匹配末尾的任何字符串。

[Route("api/flight/{flight}/{*file}")]
[HttpGet]
public async Task<IActionResult> GetImageThumbnail([FromRoute]int flight, 
    [FromRoute] string file)
{

    // Check permission
    List<Flight> data = _context
    .Flight(id: flight)
    .ToList();

    if (data.Count() == 0)
    {
    return NotFound("No permission.");
    }
    string filename = Path.Combine(data[0].BaseFolder, file);
    var provider = new Microsoft.AspNetCore.StaticFiles.FileExtensionContentTypeProvider();

    string minetype = "";
    provider.TryGetContentType(filename, out minetype);
    return PhysicalFile(filename, minetype);
}