Если User.IsInRole со строковым массивом? - PullRequest
4 голосов
/ 01 февраля 2010

Я пытаюсь создать пользовательскую проверку, где я проверяю, содержит ли роль пользователя.И у меня возникают проблемы со строковым массивом. Какой лучший способ проверить, содержит ли оно определенное значение?

    public string[] AuthRoles { get; set; }


    public override void OnActionExecuting(ActionExecutingContext filterContext)
    {

        if (AuthRoles.Length > 0)
        {

            if (!filterContext.HttpContext.User.Identity.IsAuthenticated)
            {

               RedirectToRoute(filterContext,
               new
               {
                   controller = "AdminLogin",
                   action = "AdminLogin"
               });

            }
            else
            {
                bool isAuthorized = filterContext.HttpContext.User.IsInRole(this.AuthRoles.??);

                if (!isAuthorized)
                    throw new UnauthorizedAccessException("You are not authorized to view this page");
            }
        }
        else
        {
            throw new InvalidOperationException("No Role Specified");
        }

Как мне изменить проверку для User.IsInRole, чтобы он обрабатывал массив?

Ответы [ 4 ]

12 голосов
/ 01 февраля 2010

Как насчет:

bool isAuthorized = 
    this.AuthRoles.Any(r => filterContext.HttpContext.User.IsInRole(r));

Редактировать: (Предполагая, что членства в любой из ролей достаточно для авторизации.)

8 голосов
/ 01 февраля 2010

Если вы хотите, чтобы пользователь имел все роли в AuthRoles одновременно, вам следует:

bool isAuthorized =
         Array.TrueForAll(AuthRoles, filterContext.HttpContext.User.IsInRole);

Если достаточно быть членом хотя бы одной из требуемых ролей, используйте Any:

bool isAuthorized = AuthRoles.Any(filterContext.HttpContext.User.IsInRole);
2 голосов
/ 01 февраля 2010

Вы можете сделать это с помощью простого выражения linq:

bool isAuthorized = AuthRoles.All(filterContext.HttpContext.User.IsInRole);
1 голос
/ 01 февраля 2010

Вам нужно проверить каждую строку

bool isAuthorized = false;

foreach(string role in AuthRoles)
{
  if(filterContext.HttpContext.User.IsInRole(role))
    isAuthorized = true;
}
...