using Microsoft.AspNetCore.Mvc.ApplicationModels; using Microsoft.AspNetCore.Mvc.Authorization; using Microsoft.AspNetCore.Mvc.Filters; using System.Linq; using System.Threading.Tasks; namespace JiepeiWMS.Filter { /// /// Summary:全局路由权限公约 /// Remarks:目的是针对不同的路由,采用不同的授权过滤器 /// 如果 controller 上不加 [Authorize] 特性,默认都是 Permission 策略 /// 否则,如果想特例其他授权机制的话,需要在 controller 上带上 [Authorize],然后再action上自定义授权即可,比如 [Authorize(Roles = "Admin")] /// public class GlobalRouteAuthorizeConvention : IApplicationModelConvention { public void Apply(ApplicationModel application) { foreach (var c in application.Controllers) { if (!c.Filters.Any(e => e is AuthorizeFilter)) { // 没有写特性,就用全局的 Permission 授权 c.Filters.Add(new AuthorizeFilter(Permissions.Name)); } else { // 写了特性,[Authorize] 或 [AllowAnonymous] ,根据情况进行权限认证 } } } } /// /// 全局权限过滤器【无效】 /// public class GlobalAuthorizeFilter : AuthorizeFilter { public override Task OnAuthorizationAsync(AuthorizationFilterContext context) { if (context.Filters.Any(item => item is IAsyncAuthorizationFilter && item != this)) { return Task.FromResult(0); } return base.OnAuthorizationAsync(context); } } }