Потратив много времени, пытаясь найти обходной путь для решения этой проблемы, пытаясь избежать флагов перечисления, и после прочтения ответа Стивена Мюке я пришел к выводу, что мне пришлось провести рефакторинг всей реализации авторизации. Поэтому, если кто-то пытается реализовать подобную логику авторизации, избегайте использования статического списка с перечисленными ролями и используйте флаги с самого начала. Очень полезный ответ с объяснением относительно флагов перечисления размещен здесь .
Итак, вот изменения, которые я должен был сделать, чтобы сделать эту работу.
public static class Enums
{
[Flags]
public enum Roles
{
uknown = 0,
Admin= 1 << 1,
Guest = 1 << 2
}
}
создать константное перечисление, которое содержит роли, которым разрешено выполнять действие
public static class AuthorizationHelpers{
public const Enums.Roles Can_Save_Product = Enums.Roles.Admin| Enums.Roles.Guest;
}
атрибут авторизации
[CustomAuthorization(Allowed_Roles = AuthorizationHelpers.Can_Save_Product )]
public class HomeController
{
.....
}
и, наконец, в моем атрибуте CustomAuthorization
[System.AttributeUsage(System.AttributeTargets.All, AllowMultiple = false, Inherited = true)]
public sealed class CustomAuthorizationAttribute : AuthorizeAttribute
{
public Enums.Roles Allowed_Roles { get; set; }
}
и каждый раз, когда я хочу проверить, авторизована ли текущая роль, я могу проверить, используя
AuthorizationHelpers.Can_Save_Product.HasFlag(role.ToEnum<Enums.Roles>()))
Также просто отметим, что при использовании ToString () для перечисления флагов он создает красивую разделенную запятыми строку авторизованных ролей, которую можно легко преобразовать в массив. Только не забудьте обрезать результаты, так как после каждой запятой есть пробел
this.Allowed_Roles.ToString().Split(',').Select(u=>u.Trim()).ToArray();