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


Инструкции использованию службы управления ACS для настройки поставщика удостоверений OpenID

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

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

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

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

  • OpenID 2.0

Заключение

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

Содержание

  • Цели

  • Обзор

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

  • Шаг 1. Сбор сведений о конфигурации

  • Шаг 2. Добавление ссылок на требуемые службы и сборки

  • Шаг 3. Реализация клиента службы управления

  • Шаг 4. Добавление поставщика удостоверений

Цели

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

  • Перечислить шаги добавления поставщика удостоверений OpenID.

Обзор

Служба управления — это веб-служба, которая является одним из ключевых компонентов Служба управления доступом. Она предоставляет функции, также предоставляемые пользовательским интерфейсом портала управления. Все, что можно сделать на портале управления, также можно сделать через службу управления. Добавление поставщиков удостоверений в Служба управления доступом позволяет не тратить ресурсы на разработку и обслуживание полноценного интернет-механизма управления удостоверениями. Чтобы добавить поставщик удостоверений OpenID, необходимо написать код, выполняющий ряд определенных действий. Они описаны в этом разделе.

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

  • Шаг 1. Сбор сведений о конфигурации

  • Шаг 2. Добавление ссылок на требуемые службы и сборки

  • Шаг 3. Реализация клиента службы управления

  • Шаг 4. Добавление поставщика удостоверений

Шаг 1. Сбор сведений о конфигурации

Здесь описывается сбор необходимых сведений о конфигурации. Необходимо собрать следующие сведения.

  • Имя пользователя с удостоверением службы управленияManagementClient.

  • Пароль для удостоверения службы управления — нужно получить пароль удостоверения службы управления.

    1. Войдите в портал управления службы контроля доступа.

    2. В разделе Администрирование щелкните ссылку Служба управления.

    3. На странице Служба управления щелкните ссылку ManagementClient (ManagementClient — это фактическое имя пользователя для службы).

    4. В разделе Учетные данные щелкните ссылку Симметричный ключ или Пароль. Значение в обоих разделах одинаковое. Это и есть пароль.

  • Пространство имен вашей службы

  • Имя узла ACS — обычно это accesscontrol.windows.net.

После сбора необходимых сведений выполните следующие действия, чтобы создать пример консольного приложения с кодом, добавляющим поставщик удостоверений OpenID:

  1. Откройте среду Visual Studio® 2010 и создайте новый проект консольного приложения.

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

        static string serviceIdentityUsernameForManagement = "ManagementClient";
        static string serviceIdentityPasswordForManagement = "...update to your password...";

        static string serviceNamespace = "...update to your namespace...";
        static string acsHostName = "accesscontrol.windows.net";
        static string acsManagementServicesRelativeUrl = "v2/mgmt/service/";

        static string identityProviderName = "My Open ID Identity Provider";

        static string cachedSwtToken;

Шаг 2. Добавление ссылок на требуемые службы и сборки

На этом шаге определяются и добавляются необходимые зависимости от служб и сборок.

Добавление необходимых зависимостей в службах и сборках

  1. Добавьте ссылку на System.Web.Extensions.

  2. Добавьте ссылку на службу управления. URL-адрес службы управления уникален для вашего пространства имен и выглядит следующим образом:

    https://ВАШЕПРОСТРАНСТВОИМЕН.accesscontrol.windows.net/v2/mgmt/service

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

    using System.Web; 
    using System.Net; 
    using System.Data.Services.Client; 
    using System.Collections.Specialized; 
    using System.Web.Script.Serialization;
    using System.Globalization;
    using System.Runtime.Serialization.Json;
    using ConsoleApplication1.ServiceReference1;
    

Обратите внимание на последнее объявление: ConsoleApplication1.ServiceReference1. Оно может отличаться, если вы изменили значения по умолчанию при создании консольного приложения или добавлении ссылки на службу управления.

Шаг 3. Реализация клиента службы управления

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

Реализация клиента службы управления

  1. Добавьте следующий метод в класс Program.

    public static ManagementService CreateManagementServiceClient()
            {
                string managementServiceEndpoint = String.Format(CultureInfo.InvariantCulture, "https://{0}.{1}/{2}",
                    serviceNamespace,
                    acsHostName,
                    acsManagementServicesRelativeUrl);
                ManagementService managementService = new ManagementService(new Uri(managementServiceEndpoint));
    
                managementService.SendingRequest += GetTokenWithWritePermission;
    
                return managementService;
            }
    
  2. Реализуйте метод GetTokenWithWritePermission и его вспомогательные методы. При этом в заголовок авторизации запроса HTTP будет добавлен токен SWT OAuth.

    public static void GetTokenWithWritePermission(object sender, SendingRequestEventArgs args)
            {
                GetTokenWithWritePermission((HttpWebRequest)args.Request);
            }
    
            public static void GetTokenWithWritePermission(HttpWebRequest args)
            {
                if (cachedSwtToken == null)
                {
                    cachedSwtToken = GetTokenFromACS();
                }
    
                args.Headers.Add(HttpRequestHeader.Authorization, "Bearer " + cachedSwtToken);
            }
    
            private static string GetTokenFromACS()
            {
                //
                // Request a token from ACS
                //
                WebClient client = new WebClient();
                client.BaseAddress = string.Format(CultureInfo.CurrentCulture, 
                                                   "https://{0}.{1}", 
                                                   serviceNamespace, 
                                                   acsHostName);
    
                NameValueCollection values = new NameValueCollection();
                values.Add("grant_type", "client_credentials");
                values.Add("client_id", serviceIdentityUsernameForManagement);
                values.Add("client_secret", serviceIdentityPasswordForManagement);
                values.Add("scope", client.BaseAddress + acsManagementServicesRelativeUrl);
    
                byte[] responseBytes = client.UploadValues("/v2/OAuth2-13", "POST", values);
    
                string response = Encoding.UTF8.GetString(responseBytes);
    
                // Parse the JSON response and return the access token 
                JavaScriptSerializer serializer = new JavaScriptSerializer();
    
                Dictionary<string, object> decodedDictionary = serializer.DeserializeObject(response) as Dictionary<string, object>;
    
                return decodedDictionary["access_token"] as string;
    
            }
    

Шаг 4. Добавление поставщика удостоверений

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

Добавление поставщика удостоверений OpenID

  1. В методе Main добавьте инициализацию клиента службы управления.

    ManagementService svc = CreateManagementServiceClient();
    
  2. Добавьте свой поставщик удостоверений в качестве издателя.

                Issuer issuer = new Issuer
                {
                    Name = identityProviderName
                };
                svc.AddToIssuers(issuer);
                svc.SaveChanges(SaveChangesOptions.Batch);
    
  3. Создайте поставщик удостоверений.

                var openId = new IdentityProvider
                {
                    DisplayName = identityProviderName,
                    Description = identityProviderName,
                    WebSSOProtocolType = "OpenId",
                    IssuerId = issuer.Id
                };
    
                svc.AddObject("IdentityProviders", openId);
    
  4. Обновите адрес для входа поставщика удостоверений. В данном примере для этого используется адрес www.myopenid.com. Другие поставщики удостоверений OpenID, например Google и Yahoo!, могут использовать свои адреса для входа. Это соответственно https://www.google.com/accounts/o8/ud и https://open.login.yahooapis.com/openid/op/auth.

                var openIdAddress = new IdentityProviderAddress
                {
                    Address = "https://www.myopenid.com/server",
                    EndpointType = "SignIn"
                };
    
                svc.AddRelatedObject(openId, "IdentityProviderAddresses", openIdAddress);
                svc.SaveChanges();
    
  5. Сделайте поставщик удостоверений доступным для проверяющих сторон (за исключением службы управления).

                foreach (RelyingParty rp in svc.RelyingParties)
                {
                    // skip the built-in management RP. 
                    if (rp.Name != "AccessControlManagement")
                    {
                        svc.AddToRelyingPartyIdentityProviders(new RelyingPartyIdentityProvider()
                        {
                            IdentityProviderId = openId.Id,
                            RelyingPartyId = rp.Id
                        });
                    }
                }
    
                svc.SaveChanges(SaveChangesOptions.Batch);