本文参考如下博问

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. orm Lite的使用

    1.什么是ORM Lite orm Lite(Object Relationanl Mapping Lite)是一种用于持久化保存java对象的框架,相对于标准的ORM包来说. 2. Demo ●声明 ...

  2. boost.property_tree解析xml的帮助类以及中文解析问题的解决(转)

    boost.property_tree可以用来解析xml和json文件,我主要用它来解析xml文件,它内部封装了号称最快的xml解析器rapid_xml,其解析效率还是很好的.但是在使用过程中却发现各 ...

  3. Array and Linkedlist区别与操作的时间复杂度(转载)

    转载自:http://blog.csdn.net/tm_wb/article/details/6319146 数组链表堆栈和队列 数组链表堆栈和队列是最基本的数据结构,任何程序都会涉及到其中的一种或多 ...

  4. hash bucket

    什么是bucket bucket的英文解释: Hash table lookup operations are often O(n/m) (where n is the number of objec ...

  5. 关于Java变量的可见性问题

    转自:http://www.importnew.com/19434.html 博文前提 最近在oschina问答板块看到了一个关于java变量在工作内存和主存中的可见性问题:synchorized,s ...

  6. C#代码安装Windows服务

    using System;using System.Collections.Generic;using System.ServiceProcess;using System.Configuration ...

  7. jstl 格式化

    一:JSTL格式化标签又称为I18N标签库,主要用来编写国际化的WEB应用,使用此功能可以对一个特定的语言请求做出合适的处理.例如:中国内地用户将显示简体中文,台湾地区则显示繁体中文,使用I18N格式 ...

  8. eclipse里面使用Maven搭建web工程

    一.建立Maven项目 使用Eclipse的maven构建一个web项目,以构建SpringMVC项目为例: 1.1 选择建立Maven Project 选择File -> New -> ...

  9. 配置Windows Server 2008/2012/2016允许2个用户同时远程桌面

    Windows Server 系列服务器默认情况下只能支持一个用户远程,如果第二个人远程上去之后会直接把前面一个登录用户踢掉.在日常工作中如果有多个人需要同时远程过去工作,会很不方面. 网上很多教程讲 ...

  10. css + div 列表布局

    常见列表布局,效果如下图.常见图与图之间经常会留间距,下图图与图没留间距 1.第一种列表布局:float + margin 1.2.第一种列表布局相应代码 <!DOCTYPE html> ...