C# Dotnet core:阻止通过浏览器直接访问图像的最佳方法是什么?

C# Dotnet core:阻止通过浏览器直接访问图像的最佳方法是什么?,c#,browser,.net-core,asp.net-core-webapi,C#,Browser,.net Core,Asp.net Core Webapi,我已经在IIS8上设置了一个dotnet核心API,它为aurelia应用程序打开了一个上传文件夹。我已经像这样打开了对那个文件夹的访问权限 app.UseFileServer(new FileServerOptions() { FileProvider = new PhysicalFileProvider(Configuration["ApiSettings:UploadsFolder"]), RequestPath = new

我已经在IIS8上设置了一个dotnet核心API,它为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);
}

有人能告诉我什么是阻止直接访问图像的最好方法,而只允许某个应用程序加载图像吗?

对静态文件的请求没有达到你的目的,因为IIS的静态文件处理程序正在处理该请求,然后它才到达.NET Core

对于您的.NET核心网站或服务器级别,只需从IIS的模块功能中删除StaticFileModule,请求就会通过

以下是官方的.NET核心文档,其中提到:

编辑

根据文件:

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


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

谢谢您的回复!那么,通过“删除静态文件”你说删除UseFileServer?但是uploads文件夹不再适用于api了?当通过浏览器在本地调用直接URL时,虽然它点击了if语句并返回401,但它仍然在浏览器中显示图像。否,我的意思是进入服务器上的IIS inetmgr,或者在本地(如果在dev中),转到网站,选择模块,然后删除StaticFileModule。都是通过GUI。好的,我可以这样做,但在本地通过dotnet cli它会命中我的中间件,但我仍然无法阻止请求。你知道为什么吗?你的中间件需要在使用StaticFiles之前运行,如果你想阻止它,你不需要调用下一个函数。你最后的评论是关键!谢谢我想在我的.net核心应用程序中执行类似的操作。您将Task Invoke函数放置在何处?如果有,您从何处调用它。是在Startup.cs里吗?