/// <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; } } }
/// <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); }
/// <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); }
/// <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); }
/// <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); }
/// <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); }