Инструкции по реализации авторизации утверждений в приложении ASP.NET с поддержкой утверждений на основе WIF и ACS
TOC
Свернуть оглавление
Развернуть оглавление
Эта документация перемещена в архив и не поддерживается.

Инструкции по реализации авторизации утверждений в приложении ASP.NET с поддержкой утверждений на основе WIF и ACS

Опубликовано: Апрель 2011 г.

Обновлено: Июнь 2015 г.

Назначение: Azure

  • Служба управления доступом Microsoft® Azure™ (ACS)

  • Windows® Identity Foundation (WIF)

  • ASP.NET

В этом разделе описано, как реализовать авторизацию службы контроля доступа на основе удостоверений (CBAC) в веб-приложениях ASP.NET, поддерживающих утверждения, с помощью WIF и Служба управления доступом.

  • Цели

  • Обзор

  • Сводка действий

  • Шаг 1. Реализация библиотеки авторизации утверждений.

  • Шаг 2. Настройка приложения ASP.NET для использования библиотеки авторизации утверждений.

  • Шаг 3. Настройка политики авторизации.

  • Похожие элементы

  • Экспорт логики авторизации из приложения.

  • Реализация проверок авторизации за пределами ролей для получения более полного контроля над авторизацией.

  • Предоставление декларативного управления авторизацией на основе политики.

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

  • Шаг 1. Реализация библиотеки авторизации утверждений.

  • Шаг 2. Настройка приложения ASP.NET для использования библиотеки авторизации утверждений.

  • Шаг 3. Настройка политики авторизации.

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

  1. Убедитесь, что вы запустили Visual Studio® от имени администратора.

  2. Щелкните правой кнопкой мыши нужное решение в обозревателе решений, добавьте новый проект Библиотека классов и назовите его, например, MyClaimsAuthorizationManager.

  3. Удалите класс по умолчанию (Class1.cs).

  4. Добавьте новый класс и назовите его, например, ZipClaimsAuthorizationManager. Это внедрит авторизацию на основе почтовых индексов.

  5. Добавьте ссылку к сборкам Microsoft.IdentityModel и System.Web.

  6. Добавьте следующие объявления.

    using System.IO;
    using System.Xml; 
    using Microsoft.IdentityModel.Claims; 
    using Microsoft.IdentityModel.Configuration; 
    
    
  7. Расширьте класс ClaimsAuthorizationManager, перезаписав его метод AccessCheck, а затем реализуйте конструктор в классе ZipClaimsAuthorizationManager. Код должен выглядеть примерно следующим образом.

    namespace MyClaimsAuthorizationManager 
    { 
        class ZipClaimsAuthorizationManager : ClaimsAuthorizationManager 
        { 
            private static Dictionary<string, int> m_policies = new Dictionary<string, int>(); 
    
            public ZipClaimsAuthorizationManager(object config) 
            { 
                XmlNodeList nodes = config as XmlNodeList; 
                foreach (XmlNode node in nodes) 
                { 
                    { 
                        //FIND ZIP CLAIM IN THE POLICY IN WEB.CONFIG AND GET ITS VALUE 
                        //ADD THE VALUE TO MODULE SCOPE m_policies 
                        XmlTextReader reader = new XmlTextReader(new StringReader(node.OuterXml)); 
                        reader.MoveToContent(); 
                        string resource = reader.GetAttribute("resource"); 
                        reader.Read(); 
                        string claimType = reader.GetAttribute("claimType"); 
                        if (claimType.CompareTo(ClaimTypes.PostalCode) == 0) 
                        { 
                            throw new ArgumentNullException("Zip Authorization is not specified in policy in web.config"); 
                        } 
                        int zip = -1; 
                        bool success = int.TryParse(reader.GetAttribute("Zip"),out zip); 
                        if (!success) 
                        { 
                            throw new ArgumentException("Specified Zip code is invalid - check your web.config"); 
                        } 
                        m_policies[resource] = zip; 
                    } 
                } 
            } 
            public override bool CheckAccess(AuthorizationContext context) 
            { 
                //GET THE IDENTITY 
                //FIND THE POSTALCODE CLAIM'S VALUE IN IT 
                //COMPARE WITH THE POLICY 
                int allowedZip = -1; 
                int requestedZip = -1; 
                Uri webPage = new Uri(context.Resource.First().Value); 
                IClaimsPrincipal principal = (IClaimsPrincipal)HttpContext.Current.User; 
                if (principal == null) 
                { 
                    throw new InvalidOperationException("Principal is not populate in the context - check configuration"); 
                } 
                IClaimsIdentity identity = (IClaimsIdentity)principal.Identity; 
                if (m_policies.ContainsKey(webPage.PathAndQuery)) 
                { 
                    allowedZip = m_policies[webPage.PathAndQuery]; 
                    requestedZip = -1; 
                    int.TryParse((from c in identity.Claims 
                                            where c.ClaimType == ClaimTypes.PostalCode 
                                            select c.Value).FirstOrDefault(), out requestedZip); 
                } 
                if (requestedZip!=allowedZip) 
                { 
                    return false; 
                } 
                return true; 
            } 
        } 
    }
    
    
  8. Скомпилируйте решение, чтобы убедиться в отсутствии ошибок компиляции.

  9. Найдите скомпилированную библиотеку (в данном случае MyClaimsAuthorizationManager.dll). Ее необходимо переместить в папку bin веб-приложения ASP.NET.

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

  1. Настройте веб-приложение ASP.NET, включив в его конвейер ClaimsAuthorizationModule WIF с помощью добавления следующей записи в раздел HttpModules в файле web.config (допустимо для веб-сервера разработки, который поставляется вместе с Visual Studio; для служб Internet Information Services (IIS) версии 7 эта конфигурация должна находиться в разделе "Модули" узла system.webServer).

    <add name="ClaimsAuthorizationModule" 
         type="Microsoft.IdentityModel.Web.ClaimsAuthorizationModule, Microsoft.IdentityModel, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" /> 
    
    
  2. Настройте веб-приложение ASP.NET для использования пользовательской библиотеки авторизации, реализованной в предыдущем шаге, добавив следующую запись в узел microsoft.identityModel.service.

    <claimsAuthorizationManager type="MyClaimsAuthorizationManager.ZipClaimsAuthorizationManager, MyClaimsAuthorizationManager" >
    
    

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

<policy resource="/default.aspx">
  <claim claimType=http://schemas.xmlsoap.org/ws/2005/05/identity/claims/postalcode
  Zip="11111" />
</policy>


Для доступа к странице default.aspx указанной выше политике требуется, чтобы входящий токен имел утверждение почтового индекса со значением 11111.

Показ:
© 2016 Microsoft