WYB
2021-03-22 91b8cdad021ab052e4991f3d41834a6f0ddc36b8
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
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>
    /// Summary:全局路由权限公约
    /// Remarks:目的是针对不同的路由,采用不同的授权过滤器
    /// 如果 controller 上不加 [Authorize] 特性,默认都是 Permission 策略
    /// 否则,如果想特例其他授权机制的话,需要在 controller 上带上  [Authorize],然后再action上自定义授权即可,比如 [Authorize(Roles = "Admin")]
    /// </summary>
    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] ,根据情况进行权限认证
                }
 
            }
        }
    }
 
    /// <summary>
    /// 全局权限过滤器【无效】
    /// </summary>
    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);
 
          
        }
    }
 
 
 
}