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

| Четверг, 14 марта, 2013

Метки: ASP.NET Web API Комментарии: 0

Авторизация

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

  • Фильтры авторизации (authorization filters) вызываются перед методом действия контроллера. Если запрос не авторизован, то фильтр вернет ответ с ошибкой и метод не выполнится.
  • В методе действия можно получить текущий объект principal из свойства ApiController.User. К примеру можно предоставить определенные ресурсы, только для конкретного имени пользователя.
Использование атрибута [Authorize]

У Web API есть встроенный фильтр авторизации – AuthorizeAttribute. Этот фильтр проверяет аутентифицирован ли пользователь. Если нет, то фильтр возвращает код ошибки HTTP 401 (Unauthorized), без вызова метода контроллера.

Этот фильтр можно применить глобально, к контроллеру или только к определенным методам действиям.

Глобально: Чтобы ограничить доступ ко всем контроллерам Web API в приложении, нужно добавить фильтр AuthorizeAttribute в глобальный список фильтров:

public static void Register(HttpConfiguration config)
{
    config.Filters.Add(new AuthorizeAttribute());
}

Контроллер: Для ограничения доступа к конкретному контроллеру, нужно добавить для этого контролера фильтр в виде атрибута:

// Авторизация нужна для всех методов контроллера.
[Authorize]
public class ValuesController : ApiController
{
    public HttpResponseMessage Get(int id) { ... }
    public HttpResponseMessage Post() { ... }
}

Метод действия: Для управления доступом к определенным методам действия контроллера, добавляем атрибут фильтра к этим методам:

public class ValuesController : ApiController
{
    public HttpResponseMessage Get() { ... }

    // Требуется авторизация для заданного метода.
    [Authorize]
    public HttpResponseMessage Post() { ... }
}

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

// Ограничение по имени пользователя:
[Authorize(Users="Alice,Bob")]
public class ValuesController : ApiController
{
}
   
// Ограничение по роли пользователя:
[Authorize(Roles="Administrators")]
public class ValuesController : ApiController
{
}

Фильтр AuthorizeAttribute для контроллеров Web API находится в пространстве System.Web.Http. Он похож на такой же фильтр для контроллеров MVC, который находится в пространстве System.Web.Mvc, и не совместим с контроллерами Web API.

Собственные реализации фильтра авторизации

Для написания своих реализаций фильтра авторизации нужно наследовать класс от одного из следующих типов:

  • AuthorizeAttribute. Этот класс можно расширить для написания логики авторизации на основе имени или роли пользователя.
  • AuthorizationFilterAttribute. Применяя этот класс, можно написать синхронную логику авторизации, которая не обязательно зависит от имени или роли пользователя.
  • IAuthorizationFilter. С помощью этого интерфейса можно реализовать асинхронную логику авторизации, к примеру когда нужно выполнить асинхронные операции ввода/вывода или сетевые запросы. (Если, конечно, авторизация зависит только от процессора, то лучше использовать в качестве базового класса AuthorizationFilterAttribute, тогда нет необходимости писать асинхронный метод)

Следующая диаграмма показывает иерархию для фильтра AuthorizeAttribute.

Авторизация внутри метода действия

В некоторых случаях можно разрешить выполнение метода действия, но изменять его поведение в зависимости от объекта principal. Например, возвращаемая информация зависит от роли пользователя. В методе действия можно получить текущий объект principal из свойства ApiController.User.

public HttpResponseMessage Get()
{
    if (User.IsInRole("Administrators"))
    {
        // ...
    }
}

Комментарии
Никто еще не оставил здесь комментарий.
Войдите, чтобы написать комментарий , или воспользуйтесь формой ниже.
 

Copyright © CodeHint.ru 2013-2020