【问题标题】:Dotnet core: What is the best way to block direct access to images via the browser?Dotnet core:阻止通过浏览器直接访问图像的最佳方法是什么?
【发布时间】:2017-01-29 20:48:24
【问题描述】:

我已经设置了一个 dotnet 核心 API(在 IIS8 上),它为(aurelia)应用程序打开了一个上传文件夹。我已经像这样打开了对该文件夹的访问权限

app.UseFileServer(new FileServerOptions()
        {
            FileProvider = new PhysicalFileProvider(Configuration["ApiSettings:UploadsFolder"]),
            RequestPath = new PathString("/uploads/"),
            EnableDirectoryBrowsing = true
        });

这很好用,因为应用程序可以通过 URL 在应用程序中打开上传的图像。现在,当直接在浏览器中输入 URL 时,我想阻止对这些图像的访问。我见过 C# 解决方案,但找不到 dotnet 核心解决方案。

我正在使用中间件拦截发送到 api 的请求。但无法通过浏览器拦截特定的图像请求并阻止它们。唯一允许访问图像的应该是我在固定域上的 aurelia 应用程序。

public async Task Invoke(HttpContext context)
{
     StringValues referer;
     context.Request.Headers.TryGetValue("Referer", out referer);

     // Referer will contain the full URL of the image when requested
     // via the browser. When its requested differently it will contain
     // the url of the requesting application
     if (referer.Any() && referer.First().Contains("/uploads/"))
     {
         context.Response.StatusCode = 401;
         return;
     }

     await _next.Invoke(context);
}

谁能告诉我最好的方法是阻止直接访问图像并只允许某个应用程序加载图像?

【问题讨论】:

  • 我想在我的 .net 核心应用程序中做类似的事情。您将 Task Invoke 函数放在哪里以及从哪里调用它(如果有的话)。是在 Startup.cs 中吗?

标签: c# browser .net-core asp.net-core-webapi


【解决方案1】:

对静态文件的请求不会影响到您,因为 IIS 的静态文件处理程序会在请求到达 .NET Core 之前对其进行处理。

只需从 IIS 的“模块”功能中删除“StaticFileModule”(对于您的 .NET Core 网站或在服务器级别),请求就会通过。

这里是提到这一点的官方 .NET Core 文档:https://docs.microsoft.com/en-us/aspnet/core/fundamentals/static-files#considerations

编辑

根据文档:

如果启用了 IIS 静态文件处理程序并且未正确配置 ASP.NET Core 模块 (ANCM)(例如,如果未部署 web.config),则会提供静态文件。

这实际上与我上面提到的相反。虽然删除静态文件处理程序应该仍然可以解决问题,但您还应该检查您的 ANCM 配置。

【讨论】:

  • 感谢您的回复!因此,通过“在删除静态文件时”,您说删除 UseFileServer?但是上传文件夹不再可用于 api 了吗?通过浏览器(本地)调用直接 URL 时,虽然它命中了 if 语句并返回 401,但它仍然在浏览器中显示图像。
  • 不,我的意思是进入服务器上的 IIS (inetmgr)(如果在 dev 中,则进入本地),进入网站,选择“Modules”,然后删除“StaticFileModule”。全部通过 GUI。
  • 好吧,我可以这样做,但在本地(通过 dotnet cli)它会命中我的中间件,但我仍然无法阻止请求。知道为什么会这样吗?
  • 你的中间件需要在UseStaticFiles之前运行,如果你想阻止它,你需要调用next()函数。
  • 您最后的评论是关键!谢谢!
猜你喜欢
  • 2012-06-01
  • 1970-01-01
  • 1970-01-01
  • 2010-09-26
  • 2012-11-19
  • 2013-01-23
  • 1970-01-01
  • 2020-10-18
  • 2011-06-16
相关资源
最近更新 更多