У меня есть приложение, которое требует авторизации в соответствии с правами
прав очень много (около 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");
}
}
}
Атрибут работает. Это хорошее направление?
Я хотел создать самый простой способ авторизации