Подтвердить что ты не робот

Является ли атрибут Authorize в ASP.NET MVC для аутентификации, а также для авторизации?

Я читаю ASP.NET MVC, и я просто дошел до раздела, говорящего об атрибуте Authorize. Он говорит, что атрибут Authorize используется для проверки подлинности пользователя на контроллере. Это правда? Я знаю, что атрибут предназначен для использования в целях авторизации, но также лучше использовать этот атрибут для аутентификации?

Если нет, то какова наилучшая практика для проверки (не выполнения) аутентификации?

Если да, то почему это делается так? Я что-то пропустил?

4b9b3361

Ответ 1

Атрибут

Authorize может использоваться для проверки того, вошел ли пользователь в систему. Он также может использоваться для проверки того, является ли пользователь членом определенной роли и имеет определенное имя.

В основном он использует то же самое в разделе <authorization> в web.config при использовании веб-форм.

В нем не указан метод проверки подлинности. Он обрабатывается секцией <authentication> в web.config так же, как веб-формы.

EDIT (уточнение об аутентификации и авторизации):

Аутентификация - это проверка личности. То есть вы проверяете, кто пользователь. Это может быть выполнено путем проверки имени пользователя и пароля, проверки токена проверки подлинности Windows, сканирования сетчатки, идентификации голоса или всего остального.

Авторизация - это действие, ограничивающее доступ к определенному ресурсу пользователям, удовлетворяющим определенным критериям. Чтобы иметь возможность авторизовать пользователя к ресурсу, вы должны знать права, которые есть у пользователя. Чтобы убедиться в этом, вы должны знать, кем является пользователь. Таким образом, пользователь должен быть аутентифицирован.

По сути, пустой атрибут [Authorize] выполняет авторизацию, а не аутентификацию. Он не проверяет, кто вы. Он просто проверяет, имеет ли тот, кого вы подтвердили, доступ к ресурсу или нет. Тем не менее, его критерии авторизации - "любой успешно прошедший аутентификацию". Вы можете указать другие критерии. Таким образом, действительно, он делает авторизацию, а не аутентификацию.

Ответ 2

Авторизация действительно проверяет, что пользователь аутентифицирован, иначе он не сможет определить роли для пользователя или того пользователя (кроме анонимного) текущего пользователя. То есть, для того, чтобы быть авторизованным, если анонимный доступ не разрешен, сначала необходимо пройти аутентификацию. Ниже приведен соответствующий фрагмент из метода AuthorizeCore в версии RTM (от http://www.codeplex.com/aspnet).

// This method must be thread-safe since it is called by the thread-safe OnCacheAuthorization() method.
protected virtual bool AuthorizeCore(HttpContextBase httpContext) {
    if (httpContext == null) {
        throw new ArgumentNullException("httpContext");
    }

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

    ...

Если AuthorizeCore возвращает false в OnAuthorization, тогда в AuthorizationContext.Result устанавливается новый HttpUnauthorizedResult, который приведет к тому, что пользователь будет перенаправлен на страницу входа (в FormsAuthentication) или с ошибкой.

РЕДАКТИРОВАТЬ: прочитав ваши комментарии к другим ответам, я бы сказал, что вы ARE пропущены. Технически это только разрешение. Один уровень авторизации, минимум, заключается в том, что вам необходимо пройти аутентификацию для выполнения действия. Вы получаете это, не указывая ни одного пользователя или роли для атрибута Authorize. Любой пользователь или роль разрешен, если он аутентифицирован. Указывая пользователей и/или роли, которые действуют как фильтры, вы сужаете сферу действия, и пользователю нужно не только пройти аутентификацию (чтобы вы могли проверить членство в имени/роли), но и квалифицироваться на основе фильтра.

Ответ 3

Аутентификация и авторизация - две разные проблемы.

Аутентификация проверяет, является ли пользователь тем, кем он говорит, почти всегда делается в большинстве веб-приложений, проверяя, что у него есть определенные знания (например, пароль), которые он должен знать.

Авторизация подтверждает, что у аутентифицированного пользователя есть права на выполнение чего-либо. Только администраторы могут получить доступ к страницам администратора, например.

Поскольку мы можем получить роли человека только после входа в систему, для проверки подлинности можно использовать атрибут Authorize.

Взгляните на это сообщение в блоге и посмотрите, как автор реализует как собственный атрибут Authorize, так и Authentication:

Защита действий вашего контроллера

Вы увидите, что атрибут Authorize должен проверять подлинность, так как только аутентифицированные пользователи могут иметь роль.