ASP.NET Core 自定义中间件防盗链功能。

ASP.NET Core 虽然有自带很多一些中间件,但也有时候我们也需要自定义一些中间件来完成我们需要的功能。(微软官方中间件说明)

根据官方文档的说明:(微软官方文档)

  1. 具有类型为 RequestDelegate 的参数的公共构造函数。
  2. 名为 Invoke 或 InvokeAsync 的公共方法。 此方法必须:
    • 返回 Task
    • 接受类型 HttpContext 的第一个参数。
  3. 构造函数和 Invoke/InvokeAsync 的其他参数由依赖关系注入 (DI) 填充。

 

  1. 首先创建一个类名为RefuseStealingMiddleWare
  2. 并在构造函数里添加类型为RequestDelegate 的委托参数
  3. 添加名为Invoke的方法。
    public class RefuseStealingMiddleWare
    {
        private readonly RequestDelegate _next;

        public RefuseStealingMiddleWare(RequestDelegate next)
        {
            _next = next;
        }

        public async Task Invoke(HttpContext context)
        {
            
        }
    }

我现在要写一个防盗链的中间件,然后在类中加一个方法:

        /// 
        /// 设置拒绝图片
        /// 
        /// 
        /// 
        private async Task SetForbiddenImage(HttpContext context)
        {
            string defaultImagePath = "wwwroot/Document/Img/Forbidden.jpg";
            string path = Path.Combine(Directory.GetCurrentDirectory(), defaultImagePath);

            FileStream fs = File.OpenRead(path);
            byte[] bytes = new byte[fs.Length];
            await fs.ReadAsync(bytes, 0, bytes.Length);
            await context.Response.Body.WriteAsync(bytes, 0, bytes.Length);
        }

在Invoke函数中写入一些条判断:

        public async Task Invoke(HttpContext context)
        {
            string url = context.Request.Path.Value;
            if (!url.Contains(".jpg"))
            {
                await _next(context);//走正常流程
                return;
            }

            string urlReferrer = context.Request.Headers["Referer"];
            if (string.IsNullOrWhiteSpace(urlReferrer))//直接访问
            {
                await this.SetForbiddenImage(context);//返回404图片
            }
            else if (!urlReferrer.Contains("localhost"))//非当前域名
            {
                await this.SetForbiddenImage(context);//返回404图片
            }
            else
            {
                await _next(context);//走正常流程
            }
        }

完整中间件类代码:

    public class RefuseStealingMiddleWare
    {
        private readonly RequestDelegate _next;

        public RefuseStealingMiddleWare(RequestDelegate next)
        {
            _next = next;
        }

        public async Task Invoke(HttpContext context)
        {
            string url = context.Request.Path.Value;
            if (!url.Contains(".jpg"))
            {
                await _next(context);//走正常流程
                return;
            }

            string urlReferrer = context.Request.Headers["Referer"];
            if (string.IsNullOrWhiteSpace(urlReferrer))//直接访问
            {
                await this.SetForbiddenImage(context);//返回404图片
            }
            else if (!urlReferrer.Contains("localhost"))//非当前域名
            {
                await this.SetForbiddenImage(context);//返回404图片
            }
            else
            {
                await _next(context);//走正常流程
            }
        }
        /// 
        /// 设置拒绝图片
        /// 
        /// 
        /// 
        private async Task SetForbiddenImage(HttpContext context)
        {
            string defaultImagePath = "wwwroot/Document/Img/Forbidden.jpg";
            string path = Path.Combine(Directory.GetCurrentDirectory(), defaultImagePath);

            FileStream fs = File.OpenRead(path);
            byte[] bytes = new byte[fs.Length];
            await fs.ReadAsync(bytes, 0, bytes.Length);
            await context.Response.Body.WriteAsync(bytes, 0, bytes.Length);
        }
    }

完成了中间件的编写还要使用它。回到Startup.cs 的Configure函数,使用中间件。

添加如下代码:

app.UseMiddleware();

通过app.Usemiddlewarw<自定义的中间件>泛型的方式使用;

你可能感兴趣的:(asp.net,core,C#,.net,中间件,asp.net)