实现自定义授权过滤器

1.首先创建一个类.

namespace SmArtHoTel
{
    [AttributeUsage(AttributeTargets.Class | AttributeTargets.Method, AllowMultiple = true, Inherited = true)]
    public class CustFilter : AuthorizeAttribute, IAuthorizationFilter
    {
        public async void OnAuthorization(AuthorizationFilterContext context)
        {

            if (context.ActionDescriptor.EndpointMetadata.Any(x => x is IAllowAnonymous))
            {
                return;
            }
            string AttributeInfo = context.ActionDescriptor.AttributeRouteInfo.Template;
            bool IsLogin = context.HttpContext.User.Identity.IsAuthenticated;
            if (!IsLogin)
            {
                context.Result = new StatusCodeResult((int)HttpStatusCode.Unauthorized);
            }
            else
            {

                IServiceProvider serviceProvider = context.HttpContext.RequestServices;
                var menuRepository = serviceProvider.GetService<IRepository<MenuInfo>>();

                var RoleRepository = serviceProvider.GetService<IRepository<MenuRoleTable>>();


                var roleIdList = await RoleRepository.GetQueryableAsync();
                var menuroleIdList =await menuRepository.GetQueryableAsync();
                var menuroleId = roleIdList.Where(x => menuroleIdList.Where(a => a.MenuApi == AttributeInfo).Select(s => s.MenuId).Contains(x.MenuId)).Select(x => x.RoleId).ToList();

                string UserName = context.HttpContext.User.Identity.Name;
                IEnumerable<Claim> claim = context.HttpContext.User.Claims;

                int[] roleid = claim.First(x => x.Type == ClaimTypes.Role).Value.Split(',').Select(x => Convert.ToInt32(x)).ToArray();

                var adminRoleId = Array.ConvertAll(roleid, x => Convert.ToInt32(x));

                if (!adminRoleId.Any(m => menuroleId.Contains(m)))
                {
                    context.Result = new StatusCodeResult((int)HttpStatusCode.Forbidden);
                }

            }

        }
    }
}

二.在控制器 如下

三.在Service层

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值