zoukankan      html  css  js  c++  java
  • 【netcore基础】wwwroot下静态资源文件访问权限控制

    本文参考如下博问

    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,
                };
            }

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

    搞定

  • 相关阅读:
    模态框+Tab切换显示Json/Xml格式,提交Json/Xml字符串到后台
    jeDate时间插件
    ECharts柱状图+BootstrapTable联动
    ES6新增的一些常用特性
    Array数组遍历的几种方法以及Object对象的遍历
    Arguments 对象
    数组去重几种方法
    原型链图解
    切换镜像小工具
    AppID
  • 原文地址:https://www.cnblogs.com/jhli/p/9993104.html
Copyright © 2011-2022 走看看