本文参考如下博问

https://q.cnblogs.com/q/107836

业务要求

上传的资源文件(.mp3 .mp4等)只有购买了之后才能有权限访问,所以对上传的资源文件目录进行访问权限控制

地址举例

https://localhost:5001/assets/upload/images/20181018/0d9819d2-14d2-47eb-a763-be9d19c69e42.mp4

后面的文件目录是对应上 wwwroot 下,上传的资源目录,正常情况下所有用户都可以访问,这里我们要控制权限,只有购买订单的用户才能访问。

首先

在 Startup.cs 文件的 Configure 方法里配置如下代码

            app.UseWhen(
c => c.Request.Path.Value.Contains("assets"),
_ => _.UseMiddleware<AuthorizeStaticFilesMiddleware>()); app.UseStaticFiles();

这里我们判断包含关键字的请求才会交给 AuthorizeStaticFilesMiddleware 中间件去处理。

AuthorizeStaticFilesMiddleware  代码

using GeduData.Server;
using GeduService.Interface;
using GeduService.Req;
using Microsoft.AspNetCore.Authentication;
using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Http;
using System.Threading.Tasks; namespace GeduDistributionApi.Extension
{
public class AuthorizeStaticFilesMiddleware
{
private readonly RequestDelegate _next;
private readonly IResourceService _resourceService; public AuthorizeStaticFilesMiddleware(
RequestDelegate next , IResourceService resourceService
)
{
_next = next;
_resourceService = resourceService;
} public async Task Invoke(HttpContext context, IAuthorizationService authorService)
{
var url = context.Request.GetAbsoluteUri();
var sid = context.Request.Headers["sid"].ToString();
if (string.IsNullOrEmpty(sid))
{
throw new GeduException("resource 403 forbidden sid is empty");
} var result = _resourceService.ValidateResourceAuthor(new ValidateResourceAuthorReq
{
Url = url,
SID = sid,
}); if (result.IsSucess == false)
{
await context.ForbidAsync();
} await _next(context);
} }
}

这里我们获取到请求头的 sid ,这个 sid 是我们自己定义的登录授权,可以理解为 token,里面附带了用户信息

下面就是业务逻辑处理的代码,供参考

 public ValidateResourceAuthorResp ValidateResourceAuthor(ValidateResourceAuthorReq req)
{
var loginUser = UserHelper._GetUser(req.SID); if (string.IsNullOrEmpty(req.Url))
{
throw new GeduException("url is empty");
}
//https://localhost:5001/assets/upload/images/20181018/0d9819d2-14d2-47eb-a763-be9d19c69e42.jpg
req.Url = req.Url.Trim().ToLower(); if (req.Url.EndsWith(".mp4") || req.Url.EndsWith(".mp3"))
{
//...
} return new ValidateResourceAuthorResp
{
IsSucess = true,
};
}

这里就可以写自己的订单查询,资源权限的逻辑代码了,根据业务需求自定义

搞定

【netcore基础】wwwroot下静态资源文件访问权限控制的更多相关文章

  1. SpringMVC 部署项目静态资源文件访问问题

    问题:采用SpringMVC 部署项目后程序加载或用浏览器访问时出现类似的警告,2011-01-19 10:52:51,646 WARN [org.springframework.web.servle ...

  2. springmvc基础篇—处理图片静态资源文件

    当我们在web.xml中对DispatcherServlet的过滤设置为/ 的时候,表示对所有的路径进行拦截过滤,那么不可避免的就会产生一个问题,那就是像图片这种静态资源文件我明明引用路径有,但就是加 ...

  3. Linux下进程的文件访问权限

    本文转自 http://blog.csdn.net/chosen0ne/article/details/10581883 对进程校验文件访问权限包括两个部分,一是确定进程的角色(属于哪个用户或者组), ...

  4. [Z] Linux下进程的文件访问权限

    原文链接:http://blog.csdn.net/chosen0ne/article/details/10581883 对进程校验文件访问权限包括两个部分,一是确定进程的角色(属于哪个用户或者组), ...

  5. 解决.jsp及静态资源文件访问404的问题

    我们在做Web项目时,经常将.jsp文件放到webapp\WEB-INF下,这时,我们访问jsp等文件的时候,就会报404. 如果是纯前后端分离的项目,后端只返回数据,不处理页面,也没问题.但,有时我 ...

  6. No mapping found for HTTP request with URI [/SLSaleSystem/js/jquery.dataTables.min.js] in DispatcherServlet with name 'spring' 静态资源文件访问不到,无解!!!!!!!

    报错信息:   网上三种修改 web.xml 文件方法尝试未果 尝试未果:<mvc:default-servlet-handler/> 尝试未果:方法2:直接告诉spring,这个你就得这 ...

  7. 配置url防盗链、目录权限访问控制Directory、文件访问权限控制FilesMatch

    1.配置url防盗链: 编辑:/usr/local/apache2.4/conf/extra/httpd-vhosts 文件 写入: <Directory /var/www/222/>Se ...

  8. spring mvc静态资源文件的引用

    在页面的<title>下 <link rel="stylesheet" href="<%=request.getContextPath()%> ...

  9. SpringBoot静态资源文件

    1.默认静态资源映射 Spring Boot对静态资源映射提供了默认配置 Spring Boot默认将 /** 所有访问映射到一下目录 classpath:/static classpath:/pub ...

随机推荐

  1. python 廖雪峰的官方网站

    https://www.liaoxuefeng.com/wiki/0014316089557264a6b348958f449949df42a6d3a2e542c000/0014316119884678 ...

  2. centos 终端界面代理设置

    一.centos自带界面设置代理 1. 界面设置 squid默认代理端口3128. 2. firefox设置 设置 -> 局域网设置 -> ip:port / username:passw ...

  3. 【linux】linux下对java程序生成dump文件,并使用IBM Heap Analyzer进行分析,查找定位内存泄漏的问题代码

    1.首先,java程序启动在linux,怎么生成dump文件? 1>第一步,首先你需要得到java程序的PID,最简单的方法使用如下命令 ps -ef|grep java 或者如果是docker ...

  4. 6、Python变量

    Python变量 变量的定义 变量是计算机内存中的一块区域,变量可以存储规定范围内的值,而且值可以改变. 变量的命名 变量名有字母.数字.下划线组成. 数字不能开头 不可以使用关键字 a a1 a_ ...

  5. EasyUI使用技巧总结

    combobox组件 一.禁用combobox里面的输入框 $("选择器").combo('textbox').attr("readonly", "r ...

  6. Visio画流程图风格设置

    第一步:选取设计下选用“简单” 第二步:设置颜色为“铅笔” 第三步:设置效果为“辐射” 第四步:效果

  7. CSS全局居中

    可见区域 垂直居中 top:$(document).scrollTop() + ($(document).height() - $(document).scrollTop())/2,

  8. 通俗理解word2vec

    https://www.jianshu.com/p/471d9bfbd72f 独热编码 独热编码即 One-Hot 编码,又称一位有效编码,其方法是使用N位状态寄存器来对N个状态进行编码,每个状态都有 ...

  9. 问题解决java.lang.IllegalArgumentException at org.springframework.asm.ClassReader

    手上拿到一个老的项目,使用的是spring3.2,启动的时候报错了: 查了一下,发现spring3.2不兼容jdk8,只能使用jdk8以下的版本,使用jdk6可以启动,但是maven构建的时候又提示不 ...

  10. SpringBoot中配置起动时的数据库初始化角本

    一.简介 我们使用SpringBoot + JPA时,需要程序在启动时执行数据表的初始化或者数据库记录的初始化.一般数据表的初始化可以通过在Spring Boot的application.proper ...