首页 DotNet NET8.0如何添加过滤器 怎么添加全局过滤器

NET8.0如何添加过滤器 怎么添加全局过滤器

2024-09-13 08:59 编辑:  丽丽学习网

NET8.0如何添加过滤器 怎么添加全局过滤器, netcore中过滤器的使用

一、 .net8如何添加过滤器

新建一个过滤器 MyAuthorizeAttribute.cs使其继承于Attribute, IAuthorizationFilter, 以下内容写入其中

/// <summary>
/// 自定义授权过滤器
/// </summary>
public class MyAuthorizeAttribute : Attribute, IAuthorizationFilter
{
    /// <summary>
    /// OnAuthorization
    /// </summary>
    /// <param name="context"></param>
    /// <exception cref="NotImplementedException"></exception>
    public void OnAuthorization(AuthorizationFilterContext context)
    {
        if (HasAllowAnonymous(context))
        {
            return;
        }
        //如果没有登录时,给出友好提示
        if (!context.HttpContext.User.Identity!.IsAuthenticated)
        {
            context.Result = new JsonResult(MyResults.FailResult("请登录!"));
        }
    }
    // 判断是否含有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;
    }
}

然后在每个需要添加授权的控制器上面如下形式的标注

[AllowAnonymous]
 public class HomeController : Controller
 {
     public IActionResult Login(string username,string password)
     {
           ........你的代码
         return View();
     }
 }

该控制器就不会再进行认证和授权的流程了,直接可以访问。但是每个控制器都要这样添加,就比较麻烦了,使用全局过滤器可以解决这个问题。

二、 怎么添加全局过滤器

打开Program.cs , 找到 builder.Services.AddControllers,进行修改

builder.Services.AddControllers(p => {
    //添加全局过滤器
    p.Filters.Add<MyAuthorizeAttribute>();
});

一行代码解决全局过滤器。