Поделиться через


Авторизация в веб-приложениях и службах с поддержкой утверждений

Обновлено: 19 июня 2015 г.

Область применения: Azure

Применяется к

  • Microsoft Azure Active Directory Access Control (также называется Access Control Service или ACS)

  • Windows® Identity Foundation (WIF)

  • ASP.NET

  • Windows Communication Foundation (WCF)

Сводка

В приложении с проверяющей стороной авторизация определяет, к каким ресурсам имеет доступ удостоверение, прошедшее проверку подлинности, и какие операции ему разрешается выполнять по отношению к данным ресурсам. Неправильная или слабая авторизация приводит к утечке информации и хищению данных. В этом разделе описываются доступные подходы к реализации авторизации для поддержки утверждений ASP.NET веб-приложениям и службам с помощью ACS и WIF.

Задачи

  • Перечислить способы авторизации, использующие утверждения.

  • Описать высокоуровневую концепцию для каждого подхода.

  • Указать преимущества и недостатки каждого подхода.

Обзор

Начиная с первой версии, .NET Framework предлагает гибкий механизм для внедрения авторизации. Он основан на двух простых интерфейсах IPrincipal и IIentity. Конкретные реализации IIentity представляют пользователя, прошедшего проверку подлинности. Например, реализация WindowsIdentity представляет пользователя, прошедшего проверку подлинности Active Directory, и GenericIdentity представляет пользователя, прошедшего проверку подлинности с помощью пользовательской проверки подлинности. Конкретные реализации IPrincipal помогают проверять разрешения, используя роли, в зависимости от хранилища ролей. Например, WindowsPrincipal проверяет WindowsIdentity на членство в группах Active Directory. Для проверки вызывается метод IsInRole интерфейса IPrincipal. Проверка доступа на основе ролей называется управлением доступом на основе ролей (RBAC). RBAC описывается в разделе "Управление доступом на основе ролей" этой статьи. Утверждения могут использоваться для передачи информации о ролях в целях поддержки традиционных механизмов авторизации на основе ролей.

С помощью утверждений также можно реализовать намного более широкие возможности авторизации. Утверждения могут быть основаны практически на чем угодно — возрасте, почтовом индексе, размере обуви и т. д. Проверку доступа на основе произвольных утверждений называют управлением доступом на основе утверждений (CBAC) или авторизацией на основе утверждений. Этот тип авторизации описывается в разделе "Управление доступом на основе утверждений" этой статьи.

Проверки авторизации выполняются на стороне приложения, а не на стороне ACS. ACS служит службой маркеров безопасности (STS), которая выдает маркеры, которые несут утверждения приложению. Маркеры обогащены утверждениями поставщиками удостоверений и при необходимости самим ACS, используя его обработчик правил. Когда приложение получает токен с утверждениями, оно может проанализировать его, извлечь нужные утверждения и принять решение об авторизации, используя RBAC или CBAC. WIF используется для синтаксического анализа токена и его обработки при принятии решений об авторизации с помощью простого интерфейса API. Дополнительные сведения о WIF см. в пакете SDK WIF (https://go.microsoft.com/fwlink/?LinkID=187481). При рассмотрении авторизации в приложениях и службах с поддержкой утверждений обращайтесь к следующей схеме. Обратите внимание, что после успешной проверки подлинности поставщик удостоверений создает токен (токен IdP на схеме). Маркер поставщика удостоверений можно преобразовать с помощью обработчика правил ACS. ACS может добавлять, удалять или изменять утверждения, поступающие в маркер, который выдает поставщик удостоверений. Наконец, маркер, выданный ACS, отправляется в приложение и обрабатывается WIF. Проверка доступа выполняется в WIF с использованием RBAC или CBAC.

ACS v2 WIF Authorization

Управление доступом на основе ролей

RBAC — это подход к авторизации, согласно которому управление и внедрение пользовательских разрешений осуществляется приложением на основе ролей пользователя. При наличии у пользователя необходимой роли для выполнения того или иного действия ему предоставляется доступ; в противном случае доступ не предоставляется.

Метод IPrincipal.IsInRole

Для реализации RBAC в приложениях с поддержкой утверждений используйте метод IsInRole() интерфейса IPrinicpal, как и в других приложениях. Метод IsInRole() можно использовать несколькими способами:

  • Явный вызов в IPrincipal.IsInRole(“Administrator”). При использовании данного подхода на выходе получится логическое значение. Используйте его в условных операторах. Его можно произвольно применить в любом сегменте кода.

  • Использование требования безопасности PrincipalPermission.Demand(). При использовании этого подхода результатом будет исключение, если требование не удовлетворено. Оно должно соответствовать вашей стратегии обработки исключений. Вызов исключение обходится намного дороже с точки зрения производительности по сравнению с логическим значением. Такой результат можно применить в любом сегменте кода.

  • Использование декларативных атрибутов [PrincipalPermission(SecurityAction.Demand, Role = “Administrator”)]. Такой подход называется "декларативным", поскольку он используется для декларации методов. Его нельзя использовать в блоках кода в реализациях метода. Результатом будет исключение, если требование не удовлетворено. Необходимо убедиться, что оно соответствует вашей стратегии обработки исключений.

  • Использование авторизации URL-адреса с помощью <раздела авторизации> в web.config. Этот подход подходит при управлении авторизацией на уровне URL-адреса. Это наименее детализированный уровень из указанных выше. Преимущество такого подхода состоит в том, что изменения вносятся в файл конфигурации, а следовательно, код не требуется компилировать, чтобы применить изменение.

Представление ролей как утверждений

При вызове метода IsInRole() выполняется проверка наличия у текущего пользователя данной роли. В приложениях, поддерживающих утверждения, эта роль выражается типом утверждения роли, который должен быть доступен в токене. Тип утверждения роли выражается при помощи следующего URI:

https://schemas.microsoft.com/ws/2008/06/identity/claims/role

Существует несколько способов добавления типа утверждения роли в токен:

Управление доступом на основе утверждений

CBAC — это способ авторизации, при котором решение о предоставлении доступа основывается на произвольной логике, использующей данные, доступные в утверждениях. Помните, что в случае RBAC единственным используемым утверждением являлось утверждение типа роли. Утверждение типа роли использовалось для проверки принадлежности пользователя к определенной роли. Ниже представлен пример процесса принятия системой авторизации решения на основе утверждений:

  1. Приложение получает запрос.

  2. Оно извлекает входящие утверждения.

  3. Приложение передает утверждения в механизм логики принятия решений. Это может быть код в памяти или вызов веб-службы, запрос базы данных или вызов сложного модуля правил.

  4. Механизм принятия решения вычисляет результат на основе утверждений.

  5. Доступ предоставляется, если результат имеет значение true, и не предоставляется, если результат имеет значение false. Например, правило может быть таким, что пользователь в возрасте 21 лет или выше, живет в штате Вашингтон и прошел проверку подлинности с помощью Windows Live ID (учетная запись Майкрософт).

ACS служит службой маркеров безопасности, которая выдает маркеры, которые несут утверждения. Вы можете контролировать, какие утверждения выдаются ( как типы утверждений, так и значения) с помощью обработчика правил ACS. Дополнительные сведения о обработчике правил ACS см. в разделе "Группы правил" и "Практическое руководство. Реализация логики преобразования маркеров с помощью правил". ClaimsAuthorizationManager — ключевой компонент для реализации CBAC в приложениях с поддержкой утверждений. ClaimsAuthorizationManager поставляется как часть WIF. ClaimsAuthorizationManager позволяет перехватывать входящие запросы и реализовать любую логику на усмотрение разработчика для принятия решений об авторизации на основе входящих утверждений. С помощью этого компонента вы также можете вынести решения об авторизации из кода приложения. Такая возможность приобретает существенное значение, если логику авторизации требуется изменить. В этом случае использование ClaimsAuthorizationManager не влияет на целостность приложения, благодаря чему уменьшается вероятность возникновения ошибки приложения в результате изменения. Дополнительные сведения об использовании ClaimsAuthorizationManager для реализации управления доступом на основе утверждений см. в статье "Практическое руководство. Реализация авторизации утверждений в приложении с поддержкой утверждений ASP.NET с помощью WIF и ACS".

См. также:

Основные понятия

Сценарии и решения с использованием ACS