Аргумент конструктора AuthorizeAttribute Роли равны значению string.empty? - PullRequest
2 голосов
/ 20 декабря 2011

это вопрос некоторых экзаменов MCTS 70-515.

помогите с правильными 2 ответами


Вы реализуете веб-приложение ASP.NET MVC 2, которое позволяет пользователям просматривать и редактировать данные. Необходимо убедиться, что только зарегистрированные пользователи могут получить доступ к действию Edit контроллера. Какие два возможных атрибута можно добавить к действию «Изменить» для достижения этой цели?

(Каждый правильный ответ представляет собой полное решение. Выберите два.)

  1. [Authorize (Users = "")]
  2. [Authorize (Roles = "")]
  3. [Authorize (Users = "*")]
  4. [Authorize (Roles = "*")]

Ответы [ 2 ]

6 голосов
/ 20 декабря 2011

Просмотр исходного кода AuthorizeAttribute показывает, что нет подстановочного знака "*".

Нет смысла, если [Authorize(Users = "")] приведет к тому, что "никто" не сможет получить доступ к действию.

Итак, ответ 1 и 2 правильно.

Исходный код AuthorizeAttribute

protected virtual bool AuthorizeCore(HttpContextBase httpContext) {
    if (httpContext == null) {
        throw new ArgumentNullException("httpContext");
    }

    IPrincipal user = httpContext.User;
    if (!user.Identity.IsAuthenticated) {
        return false;
    }

    if (_usersSplit.Length > 0 && !_usersSplit.Contains(user.Identity.Name, StringComparer.OrdinalIgnoreCase)) {
        return false;
    }

    if (_rolesSplit.Length > 0 && !_rolesSplit.Any(user.IsInRole)) {
        return false;
    }

    return true;
}

И свойства Role и Users.

public string Roles {
    get {
        return _roles ?? String.Empty;
    }
    set {
        _roles = value;
        _rolesSplit = SplitString(value); // simple split by comma
    }
}

public string Users {
    get {
        return _users ?? String.Empty;
    }
    set {
        _users = value;
        _usersSplit = SplitString(value); // simple split by comma
    }
}
2 голосов
/ 20 декабря 2011

Редактировать: я изменил это, так что теперь это правильно и просто дополняет правильный ответ dknaack

Обозначение действия с помощью [Authorize] означает, что пользователь должен быть аутентифицирован.

Так что если вы хотите, чтобы любой вошедший в систему пользователь мог получить доступ к действию, это нормально, просто поставить [Authorize].

dknaack сослался на исходный код, поэтому его ответ должен быть правильным, хотя мне он кажется немного странным.Но совершенно верно!

Просто добавим, что если _usersSplit похоже на нормальное разбиение на запятую, то мы ожидаем, что _usersSplit.Length будет 1, когда _users ="", и я все еще буду прав,но я полагаю, что функция split использует параметр RemoveEmptyEntries.Не могу сослаться на источник для этого, так как сейчас amkk ​​(вчера выполнял операцию на колене, пока не разрешено на компьютере - lol).

Пустая строка не является допустимым именем пользователя или роли.Смотрите здесь: http://msdn.microsoft.com/en-us/library/8fw7xh74(v=VS.100).aspx

Вы должны выбросить ArgumentException, если любое из указанных имен пользователей или ролей является пустой строкой, и ArgumentNullException, если любое из указанных имен пользователей или имен ролей равно нулю (Ничего в Visual Basic).

...