Ejemplo n.º 1
0
 /// <summary>
 /// 限制访问校验
 /// </summary>
 async Task LimitValidAsync(VisitorContext visitor)
 {
     Options.WriteRecord?.Invoke(visitor);
     visitor.Judgement = Options.ReadRecord(visitor);
     foreach (var strategy in Options.AccessStrategies)
     {
         var effected = strategy.Attempt(visitor);
         if (effected)
         {
             break;
         }
     }
 }
Ejemplo n.º 2
0
 /// <summary>
 /// 黑名单校验
 /// </summary>
 /// <returns></returns>
 public bool Attempt(VisitorContext context)
 {
     if (context.Judgement == null)
     {
         return(false);
     }
     if (context.Judgement.ContainedInBlack == null)
     {
         return(false);
     }
     if (context.Judgement.ContainedInBlack())
     {
         return(context.ChangeResult(true, LimitLevel.All));
     }
     return(false);
 }
Ejemplo n.º 3
0
        /// <summary>
        /// 中间件执行
        /// </summary>
        /// <param name="context">请求上下文</param>
        /// <returns></returns>
        public override async Task Invoke(IOwinContext context)
        {
            var token = Global.CookieProvider.GetRequestCookie(context, Options.VisitorTokenKey);

            var Visitor = new VisitorContext(context, Global.WebSite, token);

            if (Visitor.IsStatices())
            {
                await Next.Invoke(context);

                return;
            }

            await LimitValidAsync(Visitor);

            await InvokeAsync(context, Visitor);
        }
Ejemplo n.º 4
0
        /// <summary>
        /// 执行
        /// </summary>
        /// <returns></returns>
        public bool Attempt(VisitorContext context)
        {
            if (context.Judgement == null)
            {
                return(false);
            }
            if (context.Judgement.GradeInMonitoring == null)
            {
                return(false);
            }
            var grade = context.Judgement.GradeInMonitoring();

            if (grade > 0)
            {
                return(context.ChangeResult(true, LimitLevel.Limit));
            }
            return(false);
        }
Ejemplo n.º 5
0
        /// <summary>
        /// 限制请求处理
        /// </summary>
        async Task InvokeAsync(IOwinContext context, VisitorContext visitor)
        {
            switch (visitor.Result)
            {
            case LimitLevel.All:; context.Response.StatusCode = 403; return;

            case LimitLevel.None: await Next.Invoke(context); return;
            }

            if (string.IsNullOrEmpty(Options.LimitAddress))
            {
                context.Response.StatusCode = 404;
                // await Next.Invoke(context);
                return;
            }

            var url = $"{Options.LimitAddress}?ul={Global.WebSite}{visitor.Link}";

            context.Response.Redirect(url);
        }
Ejemplo n.º 6
0
        /// <summary>
        /// 排除预期结果
        /// </summary>
        public bool Attempt(VisitorContext context)
        {
            // 只监测 Get 方法
            if (context.Method.Contains("GET") == false)
            {
                return(true);
            }

            if (context.Judgement == null)
            {
                return(false);
            }
            if (context.Judgement.ContainedInExcluded == null)
            {
                return(false);
            }
            if (context.Judgement.ContainedInExcluded())
            {
                return(context.ChangeResult(true, LimitLevel.None));
            }

            return(false);
        }