捕获所有文件扩展名控制器操作以及静态文件

时间:2017-10-03 08:25:43

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

我在wwwroot文件夹中有一组文件。使用webpack,我使用js.map文件生成js包。我想在* .map文件上加上安全性,只允许某些人访问它。

documentation of ASP.NET core static files得出结论,wwwroot中的所有文件都没有安全性。如果需要安全性,建议使用MVC控制器并在操作方法上加上安全性。

我想在wwwroot中使用一个捕获所有* .js.map URL的静态文件,这些URL执行安全性并给出一个未发现的内容。如何定义此操作方法。

我不想将地图文件放在不同的文件夹中,并以不同的方式提供服务。

1 个答案:

答案 0 :(得分:0)

使用catchAll模板和约束定义这样的路线:

        app.UseMvc(routes =>
        {
            // https://haacked.com/archive/2008/07/14/make-routing-ignore-requests-for-a-file-extension.aspx/
            routes.MapRoute(
                name: "MapFiles", 
                template: "{*relativeFileUrl}", 
                defaults: new { controller = "FileSystem", action = "AccessDevFile" }, 
                constraints: new { relativeFileUrl = @".*\.js.map" }
            );
        });

动作方法如下所示。如果不允许访问,我们只返回NotFound()

    public IActionResult AccessDevFile(string relativeFileUrl)
    {
        bool hasAccess = ... do your check ...
        if(hasAccess)
        {
            return base.PhysicalFile(_hostingEnvironment.WebRootPath + "\\" + relativeFileUrl.Replace("/", @"\"), "application/json");
        }

        return NotFound();
    }

还要确保在UserStaticFiles调用之前调用UseMvc,否则永远无法访问action方法。