Практическое руководство. Использование службы управления ACS для настройки сертификатов и ключей
Обновлено: 19 июня 2015 г.
Область применения: Azure
Применяется к
- Microsoft Azure Active Directory Access Control (также называется Access Control Service или ACS)
Обзор
Сертификаты и ключи ACS можно настроить с помощью портала управления ACS или службы управления ACS. Работа со службой управления ACS может быть более эффективной, если вы создаете пользовательский пользовательский интерфейс для управления ACS или хотите автоматизировать подключение нового клиента для мультитенантных решений Software as a Service (SaaS).
Дополнительные сведения об использовании портала управления ACS для настройки сертификатов и ключей см. в разделе "Сертификаты и ключи".
Шаги по настройке сертификатов и ключей с помощью службы управления ACS
Важно!
Прежде чем выполнять следующие действия, убедитесь, что система соответствует всем требованиям .NET платформы и платформы, которые перечислены в предварительных требованиях ACS.
Чтобы настроить сертификаты и ключи с помощью службы управления ACS, выполните следующие действия.
Шаг 1. Сбор сведений о конфигурации ACS
Шаг 2. Создание примера консольного приложения
Шаг 3. Добавление ссылок на необходимые службы и сборки
Шаг 4. Реализация клиента службы управления
Шаг 5. Установка сертификатов и ключей
Добавление сертификата для подписи маркера для пространства имен управления доступом
Добавление сертификата для подписи маркера для приложения проверяющей стороны
Добавление симметричного ключа подписи маркера для пространства имен управления доступом
Добавление симметричного ключа подписи маркера для приложения проверяющей стороны
Добавление сертификата шифрования маркера
Добавление сертификата расшифровки маркера
Шаг 1. Сбор сведений о конфигурации ACS
Портал управления ACS можно использовать для сбора необходимых сведений о конфигурации. Дополнительные сведения см. на портале управления ACS.
Сбор сведений о конфигурации ACS
Перейдите на портал управления Microsoft Azure (https://manage.WindowsAzure.com), войдите в систему и щелкните Active Directory. (Совет по устранению неполадок: элемент Active Directory отсутствует или недоступен)
Для выполнения управления пространством имен Access Control выберите пространство имен и щелкните Управление. (Или щелкните Пространства имен Access Control, выберите пространство имен, а затем щелкните Управление.)
Нажмите Служба управления, ManagementClient и затем выберите Пароль.
Скопируйте значение в поле Пароль.
Нажмите Служба управления. Получите значение пространства имен службы и имени узла ACS. Если используется http://contoso.accesscontrol.windows.netURL-адрес службы управления, пространство имен — contoso , а имя узла — accesscontrol.windows.net.
Шаг 2. Создание примера консольного приложения
На этом шаге вы создадите пример консольного приложения, которое может выполнять код для добавления групп правил и правил ACS.
Создание демонстрационного консольного приложения
Откройте Visual Studio 2012 г. и создайте проект консольного приложения в соответствии с установленным шаблоном Windows.
Добавьте следующий код в класс 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;
Шаг 3. Добавление ссылок на необходимые службы и сборки
На этом шаге будут определяться и добавляться необходимые зависимости в службах и сборках.
Добавление необходимых зависимостей в службах и сборках
Щелкните правой кнопкой мыши элемент Ссылки, выберите команду Добавить ссылку и добавьте ссылку на System.Web.Extensions.
Примечание
Если требуется изменить целевую платформу демонстрационного приложения с .NET Framework 4 Client Profile, которая назначается по умолчанию при создании нового консольного приложения, на .NET Framework 4, щелкните правой кнопкой мыши имя этого демонстрационного консольного приложения в обозревателе решений, выберите пункт Свойства и измените значение для целевой платформы.
Щелкните правой кнопкой мыши пункт Ссылки на службы, выберите команду Добавить ссылку на службу и добавьте ссылку на службу управления. URL-адрес службы управления уникален для вашего пространства имен и выглядит следующим образом:
https:// YOURNAMESPACE.accesscontrol.windows.net/v2/mgmt/service
Добавьте следующие объявления, в которых 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;
Шаг 4. Реализация клиента службы управления
На этом шаге будет реализован клиент службы управления.
Реализация клиента службы управления
Добавьте следующий метод в класс 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; }
Добавьте метод 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; }
Шаг 5. Добавление сертификатов и ключей
Добавление сертификата подписи маркера для пространства имен контроль доступа
В этом примере создается сертификат подписи X.509 для пространства имен контроль доступа.
Добавление сертификата подписи маркера для всех приложений проверяющей стороны в пространстве имен контроль доступа
Инициализируйте клиент службы управления, добавив в метод Main класса Program следующий код:
ManagementService svc = CreateManagementServiceClient();
Создайте вспомогательную функцию 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; }
Чтобы добавить сертификат подписи маркеров X.509, добавьте следующий код в метод Main класса Program:
Примечание
Замените «полный путь к файлу .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, присвоенный конкретному приложению проверяющей стороны.
Добавление сертификата подписи маркера для приложения проверяющей стороны
Инициализируйте клиент службы управления, добавив в метод Main класса Program следующий код:
ManagementService svc = CreateManagementServiceClient();
Создайте вспомогательную функцию 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; }
Чтобы добавить сертификат подписи маркеров X.509, добавьте следующий код в метод Main класса Program:
Примечание
Замените «полный путь к вашему 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);
Добавление симметричного ключа подписи маркера для пространства имен контроль доступа
В этом примере этот симметричный ключ подписи назначается пространству имен контроль доступа.
Добавление симметричного ключа подписи маркера для пространства имен контроль доступа
Инициализируйте клиент службы управления, добавив в метод Main класса Program следующий код:
ManagementService svc = CreateManagementServiceClient();
Чтобы добавить симметричный ключ для подписи маркеров, добавьте следующий код в метод 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);
Добавление симметричного ключа подписи маркера для приложения проверяющей стороны
В этом примере вы назначите новый симметричный ключ подписывания для конкретного приложения проверяющей стороны.
Чтобы добавить симметричный ключ подписи маркера для приложения проверяющей стороны
Инициализируйте клиент службы управления, добавив в метод Main класса Program следующий код:
ManagementService svc = CreateManagementServiceClient();
Чтобы добавить симметричный ключ для подписи маркеров, добавьте следующий код в метод 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 для конкретного приложения проверяющей стороны.
Чтобы добавить сертификат шифрования маркера для приложения проверяющей стороны
Инициализируйте клиент службы управления, добавив в метод Main класса Program следующий код:
ManagementService svc = CreateManagementServiceClient();
Чтобы добавить сертификат шифрования маркеров X.509, добавьте следующий код в метод Main класса Program:
Примечание
Замените «полный путь к вашему 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, назначенный вашему пространству имен контроль доступа.
Добавление сертификата подписи маркера для всех приложений проверяющей стороны в пространстве имен контроль доступа
Инициализируйте клиент службы управления, добавив в метод Main класса Program следующий код:
ManagementService svc = CreateManagementServiceClient();
Создайте вспомогательную функцию 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; }
Чтобы добавить сертификат подписи маркеров X.509, добавьте следующий код в метод Main класса Program:
Примечание
Замените полный путь к вашему 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);