アプリケーションの開発Developing your application

この例では、Azure Information Protection サービス (AIP) と連携する簡単なコンソール アプリケーションを作成します。In this example you are going to build a simple console application that interacts with the Azure Information Protection service (AIP). 保護するドキュメントのパスを入力し、アドホック ポリシーまたは Azure テンプレートを使用してドキュメントを保護する手順を説明します。It will take as input the path of a document to protect, then protect it with an ad-hoc policy or an Azure template. アプリケーションは入力に従って正しいポリシーを適用し、情報が保護されたドキュメントを作成します。The application will then apply the correct policies according to the inputs, creating a information protected document. 使用するサンプル コードは、Azure IP テスト アプリケーションおよび Github を参照してください。The sample code you will be using is Azure IP test application and is on Github.

サンプル アプリの前提条件Sample app prerequisites

  • オペレーティング システム:Windows 10、Windows 8、Windows 7、Windows Server 2008、Windows Server 2008 R2、Windows Server 2012 のいずれかOperating System: Windows 10, Windows 8, Windows 7, Windows Server 2008, Windows Server 2008 R2, or Windows Server 2012
  • プログラミング言語:C# (.NET Framework 3.0 以降)Programming Language: C# (.NET Framework 3.0 and above)
  • 開発環境:Visual Studio 2015 (以降)Development environment: Visual Studio 2015 (and later)

Azure 構成のセットアップSetting up your Azure Configuration

このアプリ用に Azure をセットアップするには、テナント ID、対称キー、およびアプリケーションのプリンシパル ID を作成する必要があります。Getting Azure set up for this app requires you to create a Tenant ID, a Symmetric Key, and an Application Principal ID.

Azure AD テナントの構成Azure AD Tenant configuration

Azure Information Protection の Azure AD 環境を構成するには、 Azure Information Protection からの保護サービスのアクティブ化に関するガイダンスに従ってください。To configure the Azure AD environment for Azure Information Protection, follow the guidance in Activating the protection service from Azure Information Protection.

サービスをアクティブにすると、次の手順で PowerShell コンポーネントが必要になります。Once the service is activated you will need PowerShell components for the next steps. PowerShell を使用した Azure Information Protection からの保護の管理については、こちらを参照してください。Follow Administering protection from Azure Information Protection by using PowerShell to accomplish this.

テナント ID を取得するGetting your Tenant ID

  • 管理者として PowerShell を実行します。As an administrator, run PowerShell.
  • RMS モジュールをインポートします: Import-Module AIPServiceImport the RMS module: Import-Module AIPService
  • 割り当てられたユーザーの資格情報でサービスに接続します: Connect-AipService –VerboseConnect to the service with the assigned user credentials: Connect-AipService –Verbose
  • RMS が有効になっていることを確認します: enable-aipserviceEnsure RMS is enabled: enable-aipservice
  • Get-AipServiceConfiguration を実行してテナント ID を取得します。Get your tenant ID by running: Get-AipServiceConfiguration

BPOS ID (テナント ID) 値を記録します。Record the BPOSId (tenant ID) value. 後の手順でこの値が必要になります。You will need it in future steps.

出力例 コマンドレットの出力Example output cmdlet output

  • サービスから切断します: Disconnect-AipServiceServiceDisconnect from the service: Disconnect-AipServiceService

サービス プリンシパルの作成Create a service Principal

サービス プリンシパルを作成するには、次の手順に従います。Follow these steps to create a Service Principal:

サービス プリンシパルは、アクセス制御のためにグローバルに構成された資格情報です。サービス プリンシパルを使用するサービスでは、Microsoft Azure AD による認証および Microsoft Azure AD Rights Management を使用した情報の保護が可能になります。A service principal is credentials configured globally for access control that allow a service to authenticate with Microsoft Azure AD and to protect information using Microsoft Azure AD Rights Management

  • 管理者として PowerShell を実行します。As an administrator, run PowerShell
  • Import-Module MSOnline を使用して Microsoft Azure AD モジュールをインポートします。Import the Microsoft Azure AD module using: Import-Module MSOnline
  • 割り当てられたユーザーの資格情報でオンライン サービスに接続します: Connect-MsolServiceConnect to your online service with the assigned user credentials: Connect-MsolService
  • New-MsolServicePrincipal を実行して、新しいサービス プリンシパルを作成します。Create a new service principal by running: New-MsolServicePrincipal
  • サービス プリンシパルの名前を入力します。Provide a name for your service principal

    後で使用するために、対称キーとアプリケーションのプリンシパル ID を記録します。Record the symmetric key and application principal id for future use.

出力例 コマンドレットの出力Example output cmdlet output

  • アプリケーションのプリンシパル ID、対称キー、およびテナント ID をアプリケーションの App.config ファイルに追加します。Add your application principal id, symmetric key, and tenant ID to the application’s App.config file.

App.config ファイルの例 コマンドレットの出力Example App.config file cmdlet output

  • ClientIDRedirectUri は、Azure にアプリケーションを登録したときに入手できます。The ClientID and RedirectUri will be available to you from when you registered your application in Azure. Azure にアプリケーションを登録する方法、および ClientIDRedirectUri の取得方法の詳細については、「Azure RMS の ADAL 認証を構成する」を参照してください。For more information on how to register your application in Azure and to acquire a ClientID and RedirectUri see, Configure Azure RMS for ADAL authentication.

設計の概要Design summary

次の図は、作成するアプリのアーキテクチャとプロセス フローを示しています。図の下には手順を示しています。The following diagram depicts an architecture and process flow for the app you're creating, steps outlined below. 設計の概要design summary

  1. ユーザーは次を入力します。The user inputs:
    • 保護されるファイルのパス。The path of the file to be protected
    • テンプレートを選択するか、またはアドホック ポリシーを作成します。Selects a template or creates an ad-hoc policy
  2. アプリケーションが AIP による認証を要求します。The application requests authentication with AIP.
  3. AIP が認証を確認します。AIP confirms authentication
  4. アプリケーションが AIP のテンプレートを要求します。The application requests templates from the AIP.
  5. AIP が事前に定義されたテンプレートを返します。AIP returns pre-defined templates.
  6. アプリケーションは、指定された場所の指定されたファイルを検索します。The application locates the specified file with given location.
  7. アプリケーションは、そのファイルに AIP 保護ポリシーを適用します。The application applies the AIP protection policy to the file.

コードのしくみHow the code works

サンプルでは、Iprotect.cs ファイルを使用してソリューションの Azure IP テストを開始します。In the sample, Azure IP Test, the solution begins up with the file Iprotect.cs. Azure IP テストは C# コンソール アプリケーションであり、他の AIP 対応アプリケーションと同様に、main() メソッドで示されるように MSIPC.dll の読み込みで開始します。This is a C# console application and, like with any other AIP enabled application, you begin with loading the MSIPC.dll as shown in the main() method.

//Loads MSIPC.dll
SafeNativeMethods.IpcInitialize();
SafeNativeMethods.IpcSetAPIMode(APIMode.Server);

Azure への接続に必要なパラメーターを読み込みます。Load the parameters needed to connect to 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"];

コンソール アプリケーションにファイルのパスを入力すると、アプリケーションはドキュメントが既に暗号化されているかどうかを確認します。When you provide the file path in the console application, the application checks if the document is already encrypted. このメソッドは SafeFileApiNativeMethods クラスです。The method is of the SafeFileApiNativeMethods class.

var checkEncryptionStatus = SafeFileApiNativeMethods.IpcfIsFileEncrypted(filePath);

ドキュメントが暗号化されていない場合は、プロンプトで入力された選択に従ってドキュメントの暗号化処理が行われます。If the document is not encrypted, then it proceeds to encrypt the document with the selection provided on the prompt.

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

テンプレート オプションによる保護では、サーバーからテンプレートの一覧が取得され、選択するオプションがユーザーに提供されます。The protect with template option proceeds to get the template list from the server and provides the user the option to select.

テンプレートを変更していない場合は、AIP から既定のテンプレートを取得します。If you did not Modify templates then you will get default templates from 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);
      }
    }
  }

アドホック ポリシーを選択した場合、アプリケーションのユーザーは権限を持つユーザーのメール アドレスを入力する必要があります。If you select ad-hoc policy, the user of the application has to provide emails of the people that would have rights. このセクションでは、IpcCreateLicenseFromScratch() メソッドを使用し、テンプレートに新しいポリシーを適用してライセンスが作成されます。In this section the license is created using the IpcCreateLicenseFromScratch() method and applying the new policy on the template.

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

ユーザー操作の例User interaction example

すべて作成して実行すると、アプリケーションの出力は次のようになります。Once you get everything built and executing, the outputs of the application should look like the following:

1.暗号化方法の選択を求められます。1.You are prompted to select an encryption method. アプリの出力 - 手順 1app output - step 1

  1. 保護されるファイルのパスを入力するよう求められます。You are asked to provide the path to the file to be protected. アプリの出力 - 手順 2app output - step 2

  2. ライセンス所有者のメール アドレスを入力するよう求められます (この所有者は、Azure AD テナントでグローバル管理者の権限を持つ必要があります)。You are prompted to enter a license owner’s email (this owner must have Global Administrator privileges on the Azure AD Tenant). アプリの出力 - 手順 3app output - step 3

  3. ファイルへのアクセス権を持つユーザーのメール アドレスを入力します (メール アドレスはスペースで区切る必要があります)。You enter email addresses of users who will have rights to access the file (emails must be separated by spaces). アプリの出力 - 手順 4app output - step 4

  4. 承認されたユーザーに与えられる権限の一覧から選択します。You select from a list of rights to be given to the authorized users. アプリの出力 - 手順 5app output - step 5

  5. 最後に、ポリシーのメタデータの一部 (ポリシー名、説明、発行者 (Azure AD テナント) の表示名) を入力します。アプリの出力 - 手順 6Finally, you enter some policy metadata: policy name, description, and issuer (Azure AD Tenant) display name app output - step 6