静态文件访问在网站中是一项重要的服务,用于向前端提供可以直接访问的文件,如js,css,文档等,方法是在Startup的Configure中添加UseStaticFiles()管道。

参考:ASP.NET Core 中的静态文件

但是,如果我想让我的文档也经过授权才能访问,而不是随便一个请求就能下载,要怎么做呢?

先说一下我的环境,认证服务用的是identityserver4。访问api通过在HttpHeader中添加bearer token传递认证信息。

我想到的方法有两个:

1)首先就是把访问的文件通过API的方式返回给前端,这样就能在API加上[Authorize]标签来控制文件的访问。大概就像下面的代码

  

    [Authorize] 
  public IActionResult BannerImage()
  {
    var file = Path.Combine(Directory.GetCurrentDirectory(), "MyStaticFiles", "images", "banner1.svg");   
    return PhysicalFile(file, "image/svg+xml");
  }

  这样子会有两个问题,首先是我的项目中token信息都是存在localStore中,然后在访问api时添加到HttpHeader中,如果在浏览器里直接键入访问路径或者通过a标签打开链接的话,请求会被拒绝掉。那怎么办呢?我考虑的解决方法是把token放在cookie中,这样服务器就能通过

cookie取到token信息了,这也是asp.net core默认的方式。这个方法我没试过,算是经验之谈吧。

还有一个问题是我面试时被面试官问的,大意就是这样子的话程序就得先读取文件流再返回给前端,这样当请求数多的时候程序的内存压力不就大了么?这问题我一时没法回答,因为我觉得有点道理。但是我转念想就算把压力转移给IIS,IIS也是一样要读取文件的吧,不知道IIS有没

有针对静态文件访问做过优化。等有空再测一下这两个的性能差别。

2) 第二个方法是我现在用的,可以解决浏览器键入或者a标签访问的问题,也用不到cookie。简单说思路就是把token信息放到请求链接中,然后在后台处理token信息,把授权与认证管道放到访问静态文件目录之前。

以下是代码,假设我的要访问的静态目录是 "Storage"。

首先,处理链接中的token信息:

//在Startup中配置服务,这里只列出关键代码   
services.AddAuthentication(options=> {
options.DefaultAuthenticateScheme = JwtBearerDefaults.AuthenticationScheme;
options.DefaultChallengeScheme = JwtBearerDefaults.AuthenticationScheme;
})
.AddJwtBearer(options =>
{
options.Events = new JwtBearerEvents
{
OnMessageReceived = context =>
{
var path = context.HttpContext.Request.Path;
if (!string.IsNullOrEmpty(path) &&
(path.StartsWithSegments("/Storage")))
{
var accessToken = context.Request.Query["access_token"];
context.Token = accessToken; //把token信息设置到上下文中
}
return Task.CompletedTask;
}
};
});

在Configure中配置管道

     app.UseAuthentication();
app.UseAuthorization(); app.UseMiddleware<AuthorizeStaticFilesMiddleware>();
app.UseFileServer(new FileServerOptions //注意静态文件要写在授权和认真管道后面
{
RequestPath = "/storage",
FileProvider = new PhysicalFileProvider("your direcotry path"),
});

编写授权判断的管道文件

public class AuthorizeStaticFilesMiddleware
{
RequestDelegate _next;
public AuthorizeStaticFilesMiddleware(RequestDelegate next )
{
this._next = next;
}
public async Task Invoke(HttpContext context)
{
if (context.Request.Path.StartsWithSegments("/storage"))
{
if (context.User.Identity.IsAuthenticated) //判断用户是否认真
{
await this._next(context);
}
else
{
await context.ForbidAsync();
}
}
else
{
await this._next(context);
}
}
}

以上,就是静态文件的授权方式啦。

asp.net core 控制静态文件的授权的更多相关文章

  1. 基于 Vue.js 之 iView UI 框架非工程化实践记要 使用 Newtonsoft.Json 操作 JSON 字符串 基于.net core实现项目自动编译、并生成nuget包 webpack + vue 在dev和production模式下的小小区别 这样入门asp.net core 之 静态文件 这样入门asp.net core,如何

    基于 Vue.js 之 iView UI 框架非工程化实践记要   像我们平日里做惯了 Java 或者 .NET 这种后端程序员,对于前端的认识还常常停留在 jQuery 时代,包括其插件在需要时就引 ...

  2. 这样入门asp.net core 之 静态文件

    本文章主要说明asp.net core中静态资源处理方案: 一.静态文件服务 首先明确contentRoot和webroot这两个概念 contentRoot:web的项目文件夹,其中包含webroo ...

  3. ASP.NET Core使用静态文件、目录游览与MIME类型管理

    前言 今天我们来了解了解ASP.NET Core中的静态文件的处理方式. 以前我们寄宿在IIS中的时候,很多静态文件的过滤 和相关的安全措施 都已经帮我们处理好了. ASP.NET Core则不同,因 ...

  4. 利用ASP .NET Core的静态文件原理实现远程访问Nlog日志内容及解决遇到的坑

    最近项目上试运行发现,很多时候网站出了问题或者某个功能不正常,常常需要运维人员去服务器里面查看一下日志,看看日志里面会产生什么异常,这样导致每次都要去远程服务器很不方便,有时服务器是客户保管的不能让我 ...

  5. IIS6中ASP.NET实现对静态文件的授权控制

    后台使用html+ashx+js开发 在VS2008调试并未发现问题 发布到IIS6才发现不需要验证也能访问html文件 解决这个问题配置IIS即可了 方法如下: IIS配置:网站->属性-&g ...

  6. asp.net core 之静态文件目录的操作

    文章前言 之前写了一篇关于模拟登录的文章,自我感觉内容不太丰富,今天的这篇文章,希望在内容上能丰富些.本人缺少写文章的经验,技术上也是新手,但我会努力的,希望大家多多支持小弟. asp.net cor ...

  7. C#编译器优化那点事 c# 如果一个对象的值为null,那么它调用扩展方法时为甚么不报错 webAPI 控制器(Controller)太多怎么办? .NET MVC项目设置包含Areas中的页面为默认启动页 (五)Net Core使用静态文件 学习ASP.NET Core Razor 编程系列八——并发处理

    C#编译器优化那点事   使用C#编写程序,给最终用户的程序,是需要使用release配置的,而release配置和debug配置,有一个关键区别,就是release的编译器优化默认是启用的.优化代码 ...

  8. 使用JWT的ASP.NET CORE令牌身份验证和授权(无Cookie)——第1部分

    原文:使用JWT的ASP.NET CORE令牌身份验证和授权(无Cookie)--第1部分 原文链接:https://www.codeproject.com/Articles/5160941/ASP- ...

  9. asp.net core配置下载文件

    asp.net core的wwwroot文件夹下默认时保存静态文件的地方,外面可以直接访问,但是如果是一些无法识别的后缀文件,如(.apk),会报错404 如果想要实现下载这些文件,在配置静态文件中间 ...

随机推荐

  1. 把zTree前的展开收起图标改为三角形,且只有在点击三角形图标时才展开子节点解决方案

    <!DOCTYPE html> <html> <head> <meta charset="utf-8" /> <meta ht ...

  2. vue基本语法概要(一)

    先看两种代码,再进行讲解 第一种格式: <template > <div> <div v-for=" item in sites "> < ...

  3. 装机篇:将ubuntu 14.04安装在移动硬盘中

    这样做有诸多好处,最大的好处莫过于获得新鲜感. 需要注意的只有一点,要把bootloader装在整个硬盘的MBR而不是单独某个分区的DBR里. 另,我所成功的版本为14.04.1,之前使用14.04. ...

  4. vue组件间的传值方式及方法调用汇总

    1.传值 a.父组件传子组件 方法一: 父页面: <myReportContent v-if="contentState==1" :paramsProps='paramsPr ...

  5. 根目录/缺少执行权限x产生的两种错误

    Linux根目录缺少x权限,产生的两个错误: 以root用户执行systemctl命令报权限相关问题 [root@hps2 ~]# systemctl stop hps-manager * (pktt ...

  6. [daily]使用iptables配置NAT的命令速查

    时常,快速的配置一个临时的NAT环境是很常用需求. 但是,每次我都要读iptables的手册,才能配出来.所以,备忘一个速查. DNAT: iptables -t nat -A PREROUTING ...

  7. html和css的一些常用标签使用

    HTML(HyperText Mark-up Language)超文本标签语言 <!DOCTYPE html> <!--声明这是一个html文档--> <html> ...

  8. PAT Advanced 1108 Finding Average (20 分)

    The basic task is simple: given N real numbers, you are supposed to calculate their average. But wha ...

  9. Java&Selenium数据驱动【DataProvider+TestNG+Mysql】

    Java&Selenium数据驱动[DataProvider+TestNG+Mysql] package testNGWithDataDriven; import java.io.IOExce ...

  10. curl、fopen和file_get_contents区别

    curl多用于互联网网页之间的抓取,fopen多用于读取文件,而file_get_contents多用于获取静态页面的内容. 1. fopen /file_get_contents 每次请求都会重新做 ...