Эта документация перемещена в архив и не поддерживается.

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

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

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

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

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

Можно настроить сертификаты и ключи Служба управления доступом с помощью портала управления Служба управления доступом или службы управления Служба управления доступом. Работа со службой управления Служба управления доступом может оказаться более эффективной в том случае, если создается настраиваемый пользовательский интерфейс для управления Служба управления доступом, или если планируется автоматизировать размещение новых клиентов для мультитенантных решений "программное обеспечение как услуга" (SaaS).

Подробнее об использовании портала управления Служба управления доступом для настройки сертификатов и ключей см. в разделе Сертификаты и ключи.

ImportantВажно!
Перед выполнением следующих действий убедитесь, что система соответствует всем требованиям к .NET Framework и к платформе, которые приводятся в разделе Предварительные требования для ACS.

Чтобы настроить приложения проверяющей стороны с помощью службы управления Служба управления доступом, выполните следующие шаги.

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

  • Шаг 2. Создание примера консольного приложения

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

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

  • Шаг 5. Установка сертификатов и ключей

    • Добавление сертификата для подписи маркера для пространства имен управления доступом

    • Добавление сертификата для подписи маркера для приложения проверяющей стороны

    • Добавление симметричного ключа подписи маркера для пространства имен управления доступом

    • Добавление симметричного ключа подписи маркера для приложения проверяющей стороны

    • Добавление сертификата шифрования маркера

    • Добавление сертификата расшифровки маркера

Для сбора необходимых сведений о конфигурации можно использовать портал управления Служба управления доступом. Дополнительные сведения см. в Портал управления ACS.

  1. Перейдите на портал управления Microsoft Azure, выполните вход и щелкните Active Directory. (Совет по устранению неполадок. Элемент "Active Directory" отсутствует или недоступен)

  2. Для выполнения управления пространством имен Access Control выберите пространство имен и щелкните Управление. (Или щелкните Пространства имен Access Control, выберите пространство имен, а затем щелкните Управление.)

  3. Нажмите Служба управления, ManagementClient и затем выберите Пароль.

  4. Скопируйте значение в поле Пароль.

  5. Нажмите Служба управления. Получите значение пространства имен службы и имя узла Служба управления доступом. Если URL-адрес службы управления — http://contoso.accesscontrol.windows.net, то пространством имен является contoso, а именем узла — accesscontrol.windows.net.

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

  1. Откройте Visual Studio 2012 и создайте проект консольного приложения с помощью установленного шаблона Windows.

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

    public const string serviceIdentityUsernameForManagement = "ManagementClient";
    public const string serviceIdentityPasswordForManagement = "My Password/Key for ManagementClient";
    public const string serviceNamespace = "MyNameSpaceNoDots";
    public const string acsHostName = "accesscontrol.windows.net";
    public const string acsManagementServicesRelativeUrl = "v2/mgmt/service/";
    static string cachedSwtToken;
    
    

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

  1. Щелкните правой кнопкой мыши элемент Ссылки, выберите команду Добавить ссылку и добавьте ссылку на System.Web.Extensions.

    noteПримечание
    Если требуется изменить целевую платформу демонстрационного приложения с .NET Framework 4 Client Profile, которая назначается по умолчанию при создании нового консольного приложения, на .NET Framework 4, щелкните правой кнопкой мыши имя этого демонстрационного консольного приложения в обозревателе решений, выберите пункт Свойства и измените значение для целевой платформы.

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

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

  3. Добавьте следующие объявления, в которых MyConsoleApplication— это имя вашего консольного приложения, а MyServiceReference— имя ссылки на службу:

    using System;
    using System.IO;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    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.Security.Cryptography;
    using System.Security.Cryptography.X509Certificates; 
    using MyConsoleApplication.MyServiceReference;
    
    

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

  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 и его вспомогательные методы в класс Program. Метод GetTokenWithWritePermission и его вспомогательные методы добавляют токен SWT OAuth в заголовок авторизации запроса HTTP.

    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;
    
            }
    
    
    

В этом примере вы создадите сертификат подписи X.509 для Пространство имен Access Control.

  1. Инициализируйте клиент службы управления, добавив в метод Main класса Program следующий код:

    ManagementService svc = CreateManagementServiceClient();
    
    
  2. Создайте вспомогательную функцию ReadBytesFromPfxFile для чтения байтов сертификата X.509, добавив в класс Program следующий код:

    //Helper function to read bytes from your .pfx file
    
            public static byte[] ReadBytesFromPfxFile(string pfxFileName, string protectionPassword)
            {
                byte[] signingCertificate;
                using (FileStream stream = File.OpenRead(pfxFileName))
                {
                    using (BinaryReader br = new BinaryReader(stream))
                    {
                        signingCertificate = br.ReadBytes((int)stream.Length);
                    }
                }
                return signingCertificate;
            }
    
    
  3. Чтобы добавить сертификат подписи маркеров X.509, добавьте следующий код в метод Main класса Program:

    noteПримечание
    Замените «полный путь к файлу .PFX» на допустимый полный путь для сертификата X.509. Например, «C:\ACS2ClientCertificate.pfx».

    Замените пароль для сертификата X.509 в «MyCertificatePassword».

    X509Certificate2 cert = new X509Certificate2(@"Full path to your .PFX file", “MyCertificatePassword”);
                
                DateTime startDate, endDate;
                startDate = cert.NotBefore.ToUniversalTime();
                endDate = cert.NotAfter.ToUniversalTime();
               string pfxFileName = @"Full path to your .PFX file";
                string pfxPassword = @"MyCertificatePassword";
                
    byte[] signingCertificate = ReadBytesFromPfxFile(pfxFileName, pfxPassword);
    
    ServiceKey serviceKey = new ServiceKey()
                {
                    Type = "X509Certificate",
                    Usage = "Signing",
                    Value = signingCertificate,
                      Password = Encoding.UTF8.GetBytes("MyCertificatePassword"),
                      IsPrimary = false,
                    StartDate = startDate.ToUniversalTime(),
                    EndDate = endDate.ToUniversalTime()
                };
                svc.AddToServiceKeys(serviceKey);
                svc.SaveChanges(SaveChangesOptions.Batch);
    
    

В этом примере вы создадите сертификат подписывания X.509, присвоенный конкретному приложению проверяющей стороны.

  1. Инициализируйте клиент службы управления, добавив в метод Main класса Program следующий код:

    ManagementService svc = CreateManagementServiceClient();
    
    
  2. Создайте вспомогательную функцию ReadBytesFromPfxFile для чтения байтов сертификата X.509, добавив в класс Program следующий код:

    //Helper function to read bytes from your .pfx file
    
            public static byte[] ReadBytesFromPfxFile(string pfxFileName, string protectionPassword)
            {
                byte[] signingCertificate;
                using (FileStream stream = File.OpenRead(pfxFileName))
                {
                    using (BinaryReader br = new BinaryReader(stream))
                    {
                        signingCertificate = br.ReadBytes((int)stream.Length);
                    }
                }
                return signingCertificate;
            }
    
    
  3. Чтобы добавить сертификат подписи маркеров X.509, добавьте следующий код в метод Main класса Program:

    noteПримечание
    Замените «полный путь к вашему PFX-файлу» на полный путь для сертификата X.509. Например, «C:\ACS2ClientCertificate.pfx».

    Замените пароль для сертификата X.509 в «MyCertificatePassword».

    Замените имя приложения проверяющей стороны в «MyRelyingPartyApplication».

    //Select an existing Relying Party Application by its name
    
                RelyingParty relyingParty = svc.RelyingParties.Where(m => m.Name == "MyRelyingPartyApplication").Single();
             
               // Add a signing certificate
    
               X509Certificate2 cert = new X509Certificate2(@"Full path to your .PFX file", "MyCertificatePassword");
               DateTime startDate, endDate;
               startDate = cert.NotBefore.ToUniversalTime();
               endDate = cert.NotAfter.ToUniversalTime();
    
               string pfxFileName = @"Full path to your .PFX file";
               string pfxPassword = "MyCertificatePassword";
    
                byte[] signingCertificate = ReadBytesFromPfxFile(pfxFileName, pfxPassword);
    
               RelyingPartyKey relyingPartyKey = new RelyingPartyKey()
                {
                    StartDate = startDate.ToUniversalTime(),
                   EndDate = endDate.ToUniversalTime(),
                    Type = "X509Certificate",
                    Usage = "Signing",
                    IsPrimary = true,
                    Value = signingCertificate,
                   Password = Encoding.UTF8.GetBytes("MyCertificatePassword")
                };
    
    // Add the new signing certificate to the selected Relying Party Application
    
                svc.AddRelatedObject(relyingParty, "RelyingPartyKeys", relyingPartyKey);
    
    
            
                //Save your relying party application
    
                svc.SaveChanges(SaveChangesOptions.Batch);
    
    

В этом примере вы назначите симметричный ключ для Пространство имен Access Control.

  1. Инициализируйте клиент службы управления, добавив в метод Main класса Program следующий код:

    ManagementService svc = CreateManagementServiceClient();
    
    
  2. Чтобы добавить симметричный ключ для подписи маркеров, добавьте следующий код в метод Main класса Program:

           string symKey = "SampleTokenSigningSymmetricKey";
                DateTime startDate, endDate;
                startDate = DateTime.UtcNow;
                endDate = DateTime.MaxValue;
    
                ServiceKey serviceKey = new ServiceKey()
                {
                    
                    Type = "Symmetric",
                    Usage = "Signing",
                    Value = Encoding.UTF8.GetBytes(symKey),
                    StartDate = startDate.ToUniversalTime(),
                    EndDate = endDate.ToUniversalTime()
                };
                svc.AddToServiceKeys(serviceKey);
                svc.SaveChanges(SaveChangesOptions.Batch);
    
    

В этом примере вы назначите новый симметричный ключ подписывания для конкретного приложения проверяющей стороны.

  1. Инициализируйте клиент службы управления, добавив в метод Main класса Program следующий код:

    ManagementService svc = CreateManagementServiceClient();
    
    
  2. Чтобы добавить симметричный ключ для подписи маркеров, добавьте следующий код в метод Main класса Program:

          //Select a relying party application
    
                RelyingParty relyingParty = svc.RelyingParties.Where(m => m.Name == "MyRelyingPartyApplication").Single();
             
               // Create a symmetric key
    
                string symKey = "SampleTokenSigningSymmetricKey";
                DateTime startDate, endDate;
                startDate = DateTime.UtcNow;
                endDate = DateTime.MaxValue;
    
                RelyingPartyKey relyingPartyKey = new RelyingPartyKey()
                {
    
                    Type = "Symmetric",
                    Usage = "Signing",
                    Value = Encoding.UTF8.GetBytes(symKey),
                    StartDate = startDate.ToUniversalTime(),
                    EndDate = endDate.ToUniversalTime()
                };
             
                //Assign this symmetric key to the selected relying party application 
    
                svc.AddRelatedObject(relyingParty, "RelyingPartyKeys", relyingPartyKey);
    
                   //Save your symmetric key
    
                svc.SaveChanges(SaveChangesOptions.Batch);        
    
    

В этом примере вы добавите сертификат шифрования маркера X.509 для конкретного приложения проверяющей стороны.

  1. Инициализируйте клиент службы управления, добавив в метод Main класса Program следующий код:

    ManagementService svc = CreateManagementServiceClient();
    
    
  2. Чтобы добавить сертификат шифрования маркеров X.509, добавьте следующий код в метод Main класса Program:

    noteПримечание
    Замените «полный путь к вашему CER-файлу» на полный путь для сертификата X.509. Например, «C:\ ACS2ClientCertificate.cer».

    Замените «MyCertificatePassword» на пароль для сертификата X.509.

    Замените «MyRelyingPartyApplication» на имя приложения проверяющей стороны.

    //Select a relying party application
    
                RelyingParty relyingParty = svc.RelyingParties.Where(m => m.Name == "MyRelyingPartyApplication").Single();
             
               // Add an encryption certificate
    
                X509Certificate2 cert = new X509Certificate2(@"Full path to your .CER file");
                DateTime startDate, endDate; 
                  startDate = cert.NotBefore;
                  endDate = cert.NotAfter;
    
                RelyingPartyKey relyingPartyKey = new RelyingPartyKey()
                {
                    Type = "X509Certificate",
                    Usage = "Encrypting",
                    Value = cert.GetRawCertData(),
                    StartDate = startDate.ToUniversalTime(),
                    EndDate = endDate.ToUniversalTime()
                };
             
                //Assign this encryption certificate to the selected relying party application 
    
                svc.AddRelatedObject(relyingParty, "RelyingPartyKeys", relyingPartyKey);
    
                   //Save your encryption certificate
    
                svc.SaveChanges(SaveChangesOptions.Batch);     
    
    

В этом примере вы добавите сертификат X.509 для расшифровки маркеров, назначенный для Пространство имен Access Control.

  1. Инициализируйте клиент службы управления, добавив в метод Main класса Program следующий код:

    ManagementService svc = CreateManagementServiceClient();
    
    
  2. Создайте вспомогательную функцию ReadBytesFromPfxFile для чтения байтов сертификата X.509, добавив в класс Program следующий код:

    //Helper function to read bytes from your .pfx file
    
            public static byte[] ReadBytesFromPfxFile(string pfxFileName, string protectionPassword)
            {
                byte[] decryptionCertificate;
                using (FileStream stream = File.OpenRead(pfxFileName))
                {
                    using (BinaryReader br = new BinaryReader(stream))
                    {
                        decryptionCertificate = br.ReadBytes((int)stream.Length);
                    }
                }
                return decryptingCertificate;
            }
    
    
  3. Чтобы добавить сертификат подписи маркеров X.509, добавьте следующий код в метод Main класса Program:

    noteПримечание
    Замените полный путь к вашему PFX-файлe в коде ниже на действительный полный путь к вашему сертификату X.509. Например, если сертификат с именем ACS2ClientCertificate.pfx сохранен в папке C:\, то правильным значением для пути будет «C:\ ACS2ClientCertificate.pfx».

    Замените "MyCertificatePassword" в коде ниже на правильный пароль к сертификату X.509.

    X509Certificate2 cert = new X509Certificate2(@"Full path to your .PFX file", “MyCertificatePassword”);
                
                DateTime startDate, endDate;
                startDate = cert.NotBefore.ToUniversalTime();
                endDate = cert.NotAfter.ToUniversalTime();
               string pfxFileName = @"Full path to your .PFX file";
                string pfxPassword = @"MyCertificatePassword";
                
    byte[] decryptionCertificate = ReadBytesFromPfxFile(pfxFileName, pfxPassword);
    
    ServiceKey serviceKey = new ServiceKey()
                {
                    Type = "X509Certificate",
                    Usage = "Encrypting",
                    Value = decryptionCertificate,
                      Password = Encoding.UTF8.GetBytes("MyCertificatePassword"),
                    StartDate = startDate.ToUniversalTime(),
                    EndDate = endDate.ToUniversalTime()
                };
                svc.AddToServiceKeys(serviceKey);
                svc.SaveChanges(SaveChangesOptions.Batch);
    
    

См. также

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

Инструкции для ACS

Показ: