筛选器类型
授权筛选器
授权过滤器是过滤器管道的第一个被执行的过滤器,用于系统授权。一般不会编写自定义的授权过滤器,而是配置授权策略或编写自定义授权策略。简单举个例子。
using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.Mvc.Authorization;
using Microsoft.AspNetCore.Mvc.Filters;
namespace FilterStudy01.Filter
{
/// <summary>
/// 授权过滤器
/// builder.Services.AddMvc(options =>{options.Filters.Add(new WjAuthorizationlFilter());});
/// [TypeFilter(typeof(WjAuthorizationlFilter))]可以加在类或者控制器上
/// 不登陆的情况下访问/Admin/Index
/// </summary>
public class WjAuthorizationlFilter : IAuthorizationFilter
{
public void OnAuthorization(AuthorizationFilterContext context)
{
// 需要排除具有AllowAnymons 这个标签的控制器
// 过滤掉带有AllowAnonymousFilter
if (HasAllowAnonymous(context))
{
return;
}
// 获取当前用户的信息
var user = context.HttpContext.User;
// 自定义的授权检查逻辑
if (user == null || user?.Identity?.IsAuthenticated != true)
{
// 如果检查不通过,设置 Result 属性为一个 IActionResult 对象,可以阻止请求进一步被处理
context.Result = new ForbidResult();
}
}
// 判断是否含有IAllowAnonymous
private bool HasAllowAnonymous(AuthorizationFilterContext context)
{
if (context.Filters.Any(filter => filter is IAllowAnonymousFilter))
{
return true;
}
// 终节点:里面包含了路由方法的所有元素信息(特性等信息)
var endpoint = context.HttpContext.GetEndpoint();
return endpoint?.Metadata.GetMetadata<IAllowAnonymous>() != null;
}
}
}
https://zhuanlan.zhihu.com/p/677748480
https://blog.csdn.net/qq_41942413/article/details/135163599
https://learn.microsoft.com/zh-cn/aspnet/core/security/authorization/simple?view=aspnetcore-9.0
IP过滤器,不过这个可以放到Action过滤器中,看需求,如果全部限制可以放授权筛选器,也可以简单的做个ip黑名单和白名单
using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.Mvc.Filters;
namespace FilterStudy01.Filter
{
/// <summary>
/// 实现ip过滤器
/// </summary>
public class WjlIpAuthorizationFilter : IAuthorizationFilter
{
public void OnAuthorization(AuthorizationFilterContext context)
{
var allowIps = new List<string>()
{
"127.0.0.1"
};
var requestIp = context?.HttpContext?.Connection?.RemoteIpAddress?.ToString() ?? "";
if (!allowIps.Contains(requestIp))
{
var result = new
{
Success = false,
Msg = "非法请求"
};
if (context != null)
{
context.Result = new JsonResult(result);
}
}
}
}
}
资源筛选器
资源过滤器,在授权过滤器执行后执行,该过滤器包含“之前”和“之后”两个行为,包裹了模型绑定、操作过滤器、Action执行、异常过滤器、结果过滤器以及结果执行。
缓存结果提高网站的响应速度,缓存后,就可以直接从内存中直接取数据,而无需在执行方法。
using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.Mvc.Filters;
namespace FilterStudy01.Filter
{
/// <summary>
/// 资源过滤器实现缓存
/// IAsyncResourceFilter
/// 如果继承Attribute 使用方式如下[WjlResouerceFilter]
/// 如何不继承 builder.Services.AddMvc(options =>{options.Filters.Add(new WjlResouerceFilter());});
/// </summary>
public