Аутентификация и авторизация

Последнее обновление: 29.10.2015

Введение в аутентификацию и авторизацию

Аутентификация и авторизация в Web API имеет некоторые особенности в отличие от ASP.NET MVC. Здесь фактически нам доступны три вида аутентификации: стандартная через куки, через внешние сервисы и аутентификация с помощью токена.

В то же время Web API и ASP.NET MVC имеют ряд общих моментов.

Так, для ограничения доступа можно применять встроенную реализацию атрибута авторизации - AuthorizeAttribute, который находится в пространстве имен System.Web.Http. Он одновременно проверяет, аутентифицирован ли пользователь в системе, и также проверяет права пользователя на доступ к данному ресурсу (если данный ресурс подразумевает доступ только для определенных ролей иили пользователей). Если пользователь неаутентифицирован, то система посылает в ответ клиенту статусный код 401 (Unauthorized).

В Web API при аутентификации пользователя на сервере создается объект IPrincipal:

public interface IPrincipal
{
    IIdentity Identity { get; }
	bool IsInRole(string role);
}

Свойство Identity хранит информацию о клиенте:

public interface IIdentity
{
    // Тип аутентификации
    string AuthenticationType { get; }
    // атунтифицирован ли пользователь
    bool IsAuthenticated { get; }
    //Имя текущего пользователя 
	string Name { get; }
}

Данный объект IPrincipal затем прикрепляется сервером к текущему потоку обработки запроса с помощью установки свойства Thread.CurrentPrincipal. При успешной аутентификации пользователя у объекта IPrincipal устанавливается свойство Identity.IsAuthenticated равным true.

Авторизация на основе токенов

Данное руководство устарело. Актуальное руководство: Руководство по ASP.NET Core

Авторизация на основе токенов состоит из нескольких компонентов:

  • Клиент, который обращается к веб-сервису. Может представлять собой веб-браузер, мобильное приложение, десктопное приложение

  • Веб-сервис, к ресурсу которого обращается клиент

  • Токен доступа (access token), наличие которого дает доступ к ресурсам веб-сервиса

  • Bearer-токен - специальный вид токена доступа

  • Сервер авторизации, который выдает токены доступа клиенту

Весь процес аутентификации выглядит следующим образом:

Получение токена доступа в Oath2
  1. Пользователь вводит данные авторизации (логин, пароль) и нажимает на кнопку отправки

  2. Клиент (веб-браузер) отправляет данные серверу авторизации

  3. Сервер авторизации аутентифицирует пользователя и возвращает токен доступа

  4. Для доступа к ресурсу веб-сервиса клиент добавляет в запрос ранее полученный токен доступа

Хотя выше сервер авторизации и веб-сервис, но в реальности они могут быть объединены, как это и происходит в приложении Web API:

Получение токена доступа в ASP.NET Web API

Web API применяет спецификацию Oath2, которая описывает механизм аутентификации на основе токенов. Конкретную реализацию этой спецификации представляют компоненты OWIN, благодаря которым и производит генерация токенов, их выдача клиенту и их дальнейшая валидация. Поэтому при создании приложения Web API нам не надо самим реализовывать сервер авторизации, все эти детали, а досточно взять готовый механизм, который предоставляет ASP.NET

Посмотрим на примере, что представляет собой аутентификация токенов. Для этого создадим новый проект Web API с типом аутентификации Individual User Accounts:

Аутентификация в ASP.NET Web API

Какие узловые моменты этого проекта?

  • AccountController: контроллер, который содержит ряд методов и функциональностей для управления учетными записями (регистрация, вход на сайт и т.д.)

  • IdentityModels.cs: файл содержит определение модели пользователей ApplicationUser и контекста данных

  • IdentityConfig.cs: содержит определение класса ApplicationUserManager, который используется для управления пользователями

  • ApplicationOAuthProvider: провайдер авторизации, который обеспечивает связь с компонентами OWIN. Он содержит два метода, один из которых - GrantResourceOwnerCredentials() как раз используется для генерации токена

  • Startup.Auth.cs: содержит настройки инфраструктуры OWIN

    Непосредственно к использованию токенов относится следующая часть файла:

    PublicClientId = "self";
    
    OAuthOptions = new OAuthAuthorizationServerOptions
    {
    	// устанавливает URL, по которому клиент будет получать токен
        TokenEndpointPath = new PathString("/Token"),
    	// указывает на вышеопределенный провайдер авторизации
        Provider = new ApplicationOAuthProvider(PublicClientId),
        AuthorizeEndpointPath = new PathString("/api/Account/ExternalLogin"),
        AccessTokenExpireTimeSpan = TimeSpan.FromDays(14),
        AllowInsecureHttp = true
    };
    // включает в приложении функциональность токенов
    app.UseOAuthBearerTokens(OAuthOptions);
    

    Параметр TokenEndpointPath указывает на маршрут для получения токена

    Параметр Provider указывает на провайдер авторизации

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

  • WebApiConfig.cs. В методе Register происходит настройка аутентификации Web API, чтобы она использовала только аутентификацию токенов:

    config.SuppressDefaultHostAuthentication();
    config.Filters.Add(new HostAuthenticationFilter(OAuthDefaults.AuthenticationType));
    

    Класс HostAuthenticationFilter подключает аутентификацию токенов, а метод SuppressDefaultHostAuthentication() указывает Web API игнорировать любую аутентификацию, которая происходит до того, как обработка запроса достигнет конвейера Web API. Это позволяет отключить атуентификацию на основе кук, и тем самым защитить приложение от CSRF-атак.

Теперь разберем два момента: получение и валидацию токена. Если требуется получить токен:

  1. Клиент обращается к ресурсу /Token для получения токена

  2. Если в пришедшем запросе есть заголовок "grant_type" и он имеет значение "password", то система вызывает метод GrantResourceOwnerCredentials() у провайдера авторизации ApplicationOAuthProvider

  3. Провайдер авторизации обращается к классу ApplicationUserManager для валидации поступивших данных (логина и пароля) и по ним создает объект claims identity

  4. Если валидация прошла успешно, то провайдер авторизации создает аутентификационный тикет, который применяется для генерации токена

Если клиент обращается к защищенному атрибутом Authorize ресурсу с имеющимся токеном:

  1. Фильтр HostAuthentication обращается к компонентам OAuth для валидации токена

  2. Компоненты OAuth пытаются восстановить по токену объект claims identity

  3. Затем фильтр авторизации смотрит, имеет ли права доступа пользователь, который представлен восстановленным объектом claims identity

  4. Если все прошло успешно, пользователь получает доступ к ресурсу, иначе ему отправляется статусный код 401 (Unauthorized)

Помощь сайту
Юмани:
410011174743222
Перевод на карту
Номер карты:
4048415020898850