Разработка приложения
Внимание
Версии пакета SDK службы Microsoft Rights Management, выпущенные до марта 2020 г., устарели; для использования выпуска за март 2020 г. необходимо обновить приложения, использующие более ранние версии. Полные сведения см. в уведомлении об отмене.
Для пакета SDK службы microsoft Rights Management не планируется никаких дополнительных улучшений. Настоятельно рекомендуется внедрить пакет SDK Microsoft Information Protection для классификации, маркировки и защиты.
В этом примере вы создадите простое консольное приложение, взаимодействующее со службой Azure Information Protection (AIP). Он будет принимать в качестве входных данных путь к защите документа, а затем защитить его с помощью нерегламентированной политики или шаблона Azure. Затем приложение будет применять правильные политики в соответствии с входными данными, создавая защищенный сведениями документ. Пример кода, который вы будете использовать, — это тестовое приложение Azure IP и находится на сайте Github.
Предварительные требования для примера приложения
- Операционная система: Windows 10, Windows 8, Windows 7, Windows Server 2008, Windows Server 2008 R2 или Windows Server 2012
- Язык программирования: C# (платформа .NET Framework 3.0 и более поздней версии)
- Среда разработки: Visual Studio 2015 (и более поздние версии)
Настройка конфигурации Azure
Чтобы настроить Azure для этого приложения, необходимо создать идентификатор клиента, симметричный ключ и идентификатор субъекта приложения.
Конфигурация клиента Azure AD
Чтобы настроить среду Azure AD для Azure Information Protection, следуйте инструкциям в статье "Активация службы защиты из Azure Information Protection".
После активации службы потребуются компоненты PowerShell для выполнения следующих действий. Для этого выполните администрирование защиты от Azure Information Protection с помощью PowerShell .
Получение идентификатора клиента
- В качестве администратора запустите PowerShell.
- Импортируйте модуль RMS:
Import-Module AIPService
- Подключитесь к службе с назначенными учетными данными пользователя:
Connect-AipService –Verbose
- Убедитесь, что RMS включена:
enable-aipservice
- Получите идентификатор клиента, выполнив команду:
Get-AipServiceConfiguration
Запишите значение BPOSId (идентификатор клиента). Она понадобится в дальнейшем.
Пример результата
- Отключение от службы:
Disconnect-AipServiceService
Создание субъекта-службы
Выполните следующие действия, чтобы создать субъект-службу:
Субъект-служба — это учетные данные, настроенные глобально для управления доступом, которые позволяют службе проходить проверку подлинности с помощью Microsoft Azure AD и защищать информацию с помощью Microsoft Azure AD Rights Management
- Запуск PowerShell от имени администратора
- Импорт модуля Microsoft Azure AD с помощью:
Import-Module MSOnline
- Подключитесь к веб-службе с назначенными учетными данными пользователя:
Connect-MsolService
- Создайте субъект-службу, выполнив команду:
New-MsolServicePrincipal
- Укажите имя субъекта-службы
Запишите симметричный ключ и идентификатор субъекта приложения для дальнейшего использования.
Пример результата
- Добавьте идентификатор субъекта приложения, симметричный ключ и идентификатор клиента в файл app.config приложения.
Пример файла App.config
- ClientID и RedirectUri будут доступны при регистрации приложения в Azure. Дополнительные сведения о том, как зарегистрировать приложение в Azure и получить ClientID и RedirectUri см. в статье "Настройка Azure RMS для проверки подлинности ADAL".
Сводка по проектированию
На следующей схеме показана архитектура и поток процессов для создаваемого приложения, описанные ниже.
- Входные данные пользователя:
- Путь к защищенному файлу
- Выбор шаблона или создание нерегламентированной политики
- Приложение запрашивает проверку подлинности с помощью AIP.
- AIP подтверждает проверку подлинности
- Приложение запрашивает шаблоны из AIP.
- AIP возвращает предварительно определенные шаблоны.
- Приложение находит указанный файл с заданным расположением.
- Приложение применяет политику защиты AIP к файлу.
Принцип работы кода
В примере теста IP-адресов Azure решение начинается с Iprotect.cs файла. Это консольное приложение C# и, как и в любом другом приложении с поддержкой AIP, вы начинаете с загрузки MSIPC.dll , как показано в методе main()
.
//Loads MSIPC.dll
SafeNativeMethods.IpcInitialize();
SafeNativeMethods.IpcSetAPIMode(APIMode.Server);
Загрузка параметров, необходимых для подключения к Azure
//Loads credentials for the service principal from App.Config
SymmetricKeyCredential symmetricKeyCred = new SymmetricKeyCredential();
symmetricKeyCred.AppPrincipalId = ConfigurationManager.AppSettings["AppPrincipalId"];
symmetricKeyCred.Base64Key = ConfigurationManager.AppSettings["Base64Key"];
symmetricKeyCred.BposTenantId = ConfigurationManager.AppSettings["BposTenantId"];
При предоставлении пути к файлу в консольном приложении приложение проверяет, зашифрован ли документ. Метод имеет класс SafeFileApiNativeMethods .
var checkEncryptionStatus = SafeFileApiNativeMethods.IpcfIsFileEncrypted(filePath);
Если документ не зашифрован, он продолжает шифровать документ с выбранным выбором, указанным в запросе.
if (!checkEncryptionStatus.ToString().ToLower().Contains(alreadyEncrypted))
{
if (method == EncryptionMethod1)
{
//Encrypt a file via AIP template
ProtectWithTemplate(symmetricKeyCred, filePath);
}
else if (method == EncryptionMethod2)
{
//Encrypt a file using ad-hoc policy
ProtectWithAdHocPolicy(symmetricKeyCred, filePath);
}
}
Параметр защиты с помощью параметра шаблона переходит к получению списка шаблонов с сервера и предоставляет пользователю возможность выбора.
Если вы не изменяли шаблоны, вы получите шаблоны по умолчанию из AIP
public static void ProtectWithTemplate(SymmetricKeyCredential symmetricKeyCredential, string filePath)
{
// Gets the available templates for this tenant
Collection<TemplateInfo> templates = SafeNativeMethods.IpcGetTemplateList(null, false, true,
false, true, null, null, symmetricKeyCredential);
//Requests tenant template to use for encryption
Console.WriteLine("Please select the template you would like to use to encrypt the file.");
//Outputs templates available for selection
int counter = 0;
for (int i = 0; i < templates.Count; i++)
{
counter++;
Console.WriteLine(counter + ". " + templates.ElementAt(i).Name + "\n" +
templates.ElementAt(i).Description);
}
//Parses template selection
string input = Console.ReadLine();
int templateSelection;
bool parseResult = Int32.TryParse(input, out templateSelection);
//Returns error if no template selection is entered
if (parseResult)
{
//Ensures template value entered is valid
if (0 < templateSelection && templateSelection <= counter)
{
templateSelection -= templateSelection;
// Encrypts the file using the selected template
TemplateInfo selectedTemplateInfo = templates.ElementAt(templateSelection);
string encryptedFilePath = SafeFileApiNativeMethods.IpcfEncryptFile(filePath,
selectedTemplateInfo.TemplateId,
SafeFileApiNativeMethods.EncryptFlags.IPCF_EF_FLAG_KEY_NO_PERSIST, true, false, true, null,
symmetricKeyCredential);
}
}
}
При выборе нерегламентированной политики пользователь приложения должен предоставить сообщения электронной почты пользователей, которые будут иметь права. В этом разделе лицензия создается с помощью метода IpcCreateLicenseFromScratch() и применения новой политики к шаблону.
if (issuerDisplayName.Trim() != "")
{
// Gets the available issuers of rights policy templates.
// The available issuers is a list of RMS servers that this user has already contacted.
try
{
Collection<TemplateIssuer> templateIssuers = SafeNativeMethods.IpcGetTemplateIssuerList(
null,
true,
false,
false, true, null, symmetricKeyCredential);
// Creates the policy and associates the chosen user rights with it
SafeInformationProtectionLicenseHandle handle = SafeNativeMethods.IpcCreateLicenseFromScratch(
templateIssuers.ElementAt(0));
SafeNativeMethods.IpcSetLicenseOwner(handle, owner);
SafeNativeMethods.IpcSetLicenseUserRightsList(handle, userRights);
SafeNativeMethods.IpcSetLicenseDescriptor(handle, new TemplateInfo(null, CultureInfo.CurrentCulture,
policyName,
policyDescription,
issuerDisplayName,
false));
//Encrypts the file using the ad hoc policy
string encryptedFilePath = SafeFileApiNativeMethods.IpcfEncryptFile(
filePath,
handle,
SafeFileApiNativeMethods.EncryptFlags.IPCF_EF_FLAG_KEY_NO_PERSIST,
true,
false,
true,
null,
symmetricKeyCredential);
}
}
Пример взаимодействия с пользователем
После получения всего созданного и выполнения выходные данные приложения должны выглядеть следующим образом:
Вам будет предложено выбрать метод шифрования.
Вам будет предложено указать путь к защищенному файлу.
Вам будет предложено ввести сообщение электронной почты владельца лицензии (этот владелец должен иметь права глобального администратора в клиенте Azure AD).
Вы вводите адреса электронной почты пользователей, у которых есть права на доступ к файлу (сообщения электронной почты должны быть разделены пробелами).
Вы выбираете из списка прав, которые будут предоставлены авторизованным пользователям.
Наконец, введите некоторые метаданные политики: имя политики, описание и издатель (клиент Azure AD)