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

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

搞定

原文地址:https://www.cnblogs.com/jhli/p/9993104.html