Создайте собственный атрибут авторизации - PullRequest
0 голосов
/ 05 июля 2019

У меня есть приложение, которое требует авторизации в соответствии с правами

прав очень много (около 200, может быть, будет больше)

Одно или несколько прав могут быть назначены одной конечной точке

Пример:

[HasRights(Rights.AddPayer, Rights.DeletePayer)]
[HttpPost]
public IActionResult AddPayer([FromBody]PayerModel model)
{
}

Я начинаю строить класс для атрибута

[AttributeUsage(AttributeTargets.Method | AttributeTargets.Class, Inherited = false)]
    public class HasRightsAttribute : AuthorizeAttribute, IAuthorizationFilter
    {
        HashSet<Rights> userRights;

        public HasRightsAttribute(params Rights[] rights)
        {
            userRights = rights.ToHashSet();
        }

        public void OnAuthorization(AuthorizationFilterContext context)
        {
            Claim claim = context.HttpContext.User.Claims.FirstOrDefault();
            int userId = int.Parse(claim.Value);

            List<int> rights;

            using (var myContext = new myDB())
            {
                rights = (from UR in myContext.TblUserRole
                          join RR in myContext.TblRoleRight on UR.RoleID equals RR.RoleID
                          where UR.UserID == userId
                          select RR.RightID)
                          .ToList();
            }

            var permission = rights.Any(x => userRights.Contains((Rights)Enum.ToObject(typeof(Rights), x)));

            if (!permission)
            {
                //context.Result = new ForbidResult();
                Debug.WriteLine("NO ACCESS");
            }
            else
            {
                Debug.WriteLine("YOU HAVE ACCESS");
            }
        }
    }

Атрибут работает. Это хорошее направление?

Я хотел создать самый простой способ авторизации

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...