Сценарий, подобный тому, что я сделал, вместо того, чтобы иметь роли в виде строк, а затем перечислять флаги
[Flags]
public enum Permissions
{
None = 0,
Registered = 1 << 0,
SuperAdmin = 1 << 1,
Manager = 1 << 2,
// Etc...
}
Используя этот метод, вы можете затем использовать этот метод для пользователя, чтобы определить, какие роли разрешены:
public bool IsInRole(Permissions roles)
{
var rolesToCheck = roles.GetFlags().Where(p => p != Permissions.None);
return rolesToCheck.Any(role => Roles.HasFlag(role));
}
и:
if(User.IsInRole(Permissions.SuperAdmin | Permissions.Manager)
{
// Do something
}
Аналогичным образом вы также можете добавить это к атрибуту, создав собственное расширение атрибута Authorize:
public class CustomAuthorize : ActionFilterAttribute, IActionFilter
{
public Permissions Roles { get; set; }
void IActionFilter.OnActionExecuting(ActionExecutingContext filterContext)
{
bool authorized = false;
var roleFlags = Roles.GetFlags();
if (!roleFlags.All(r => r == Permissions.None))
{
foreach (var role in roleFlags.Where(p => p != RolePermissions.None))
{
if (maritimeUser.Roles.HasFlag(role))
{
authorized = true;
}
}
}
if (Roles == Permissions.None)
{
// No roles set, so authorise = okay
return;
}
if (!authorized)
{
filterContext.Result =
new RedirectToRouteResult(
new RouteValueDictionary
{
{"controller", "Account"},
{"action", "Unauthorised"},
{"area", "" }
});
return;
}
}
и использовать
[CustomAuthorize(Roles = Permissions.SuperAdmin | Permissions.Manager)]