クイック スタート: クライアント アプリケーションの初期化 (C#)

このクイックスタートでは、実行時に MIP SDK .NET ラッパーによって使用される、クライアントの初期化パターンを実装する方法を示します。

Note

MIP .NET wrapper's File、MIP Policy、MIP Protection の各 SDK を使用するすべてのクライアント アプリケーションに対して、このクイック スタートで概説されている手順を実施する必要があります。 このクイック スタートでは File SDK の使用方法を示しますが、この同じパターンを、Policy と Protection の SDK を使用するクライアントにも適用できます。 以降の各クイック スタートは、先行するものに基づいて作成されるため、これを最初に、順次実行してください。 このコードは、MIP SDK の使用を開始する方法を示すことを目的としており、運用環境での使用を目的としたものではありません。

前提条件

まだ実施していない場合は、必ず次の作業を行ってください。

  • Microsoft Information Protection (MIP) SDK のセットアップと構成」の手順を完了します。 この "クライアント アプリケーションの初期化" クイック スタートは、適切な SDK のセットアップと構成に依存します。
  • 必要に応じて:
    • プロファイルとエンジンのオブジェクトに関する記事を確認します。 プロファイルとエンジンのオブジェクトは、MIP File、MIP Policy、MIP Protection の各 SDK を使用するクライアントによって必要とされるユニバーサルな概念です。
    • 認証の概念に関する記事を確認して、認証と同意が SDK とクライアント アプリケーションによってどのように実装されるかについて学習します。

Visual Studio のソリューションとプロジェクトを作成する

まず、最初の Visual Studio ソリューションとプロジェクトを作成して構成します。他のクイックスタートは、これに基づいて構築されます。

  1. Visual Studio 2019 を開いて、[ファイル] メニュー、[新規][プロジェクト] の順に選択します。 [新しいプロジェクト] ダイアログで次の操作を行います。

    • 左側のペインの [インストール済み][Visual C#] の下の、[Windows デスクトップ] を選択します。

    • 中央のペインで、[コンソール アプリ (.NET Framework)] を選択します

    • 下部のペインで、プロジェクトの [名前][場所]、含める [ソリューション名] を適宜更新します。

    • 完了したら、右下の [OK] ボタンをクリックします。

      Visual Studio solution creation

  2. MIP File SDK 用の Nuget パッケージをプロジェクトに追加します。

    • ソリューション エクスプローラーで、プロジェクト ノード (最上位/ソリューション ノードのすぐ下) を右クリックして、[NuGet パッケージの管理] を選択します。
    • [エディター グループ] タブ領域で [NuGet パッケージ マネージャー] タブが開いたら、次の操作を行います。
      • 参照を選択します。
      • 検索ボックスに「Microsoft.InformationProtection」と入力します。
      • [Microsoft.InformationProtection.File] パッケージを選択します。
      • [インストール] をクリックし、[変更のプレビュー] の確認ダイアログが表示されたら [OK] をクリックします。
  3. 上記の手順を繰り返して MIP File SDK パッケージを追加しますが、代わりに "Microsoft.Identity.Client" をアプリケーションに追加します。

認証の委任を実装する

MIP SDK では、クラスの拡張機能を使用して認証を実装します。これにより、認証作業をクライアント アプリケーションと共有するメカニズムが提供されます。 クライアントは、適切な OAuth2 アクセス トークンを取得し、実行時に MIP SDK に提供する必要があります。

ここで、SDK の Microsoft.InformationProtection.IAuthDelegate インターフェイスを拡張し、IAuthDelegate.AcquireToken() 仮想関数をオーバーライドまたは実装することで、認証の委任の実装を作成します。 認証の委任はインスタンス化され、FileProfileFileEngine のオブジェクトによって後で使用されます。

  1. Visual Studio でプロジェクト名を右クリックし、[追加][クラス] の順に選択します。

  2. [名前] フィールドに「AuthDelegateImplementation」と入力します。 [追加] をクリックします。

  3. 次のように、Microsoft 認証ライブラリ (MSAL) と MIP ライブラリに対する using ステートメントを追加します。

    using Microsoft.InformationProtection;
    using Microsoft.Identity.Client;
    
  4. Microsoft.InformationProtection.IAuthDelegate を継承し、Microsoft.InformationProtection.ApplicationInfo のプライベート変数と、同じ型を受け取るコンストラクターを実装するように AuthDelegateImplementation を設定します。

    public class AuthDelegateImplementation : IAuthDelegate
    {
       private ApplicationInfo _appInfo;
       // Microsoft Authentication Library IPublicClientApplication
       private IPublicClientApplication _app;
       public AuthDelegateImplementation(ApplicationInfo appInfo)
       {
           _appInfo = appInfo;
       }
    
    }
    

    ApplicationInfo オブジェクトには、3 つのプロパティが含まれています。 _appInfo.ApplicationId は、AuthDelegateImplementation クラスで使用され、認証ライブラリにクライアント ID を提供します。 ApplicationNameApplicationVersion は、Azure Information Protection 分析レポートに表示されます。

  5. public string AcquireToken() メソッドを追加します。 このメソッドは、Microsoft.InformationProtection.Identity と、機関の URL、リソース URI、および要求 (必要な場合) の 3 つの文字列を受け付けます。 これらの文字列変数は API によって認証ライブラリに渡され、操作しないようにする必要があります。 テナントの Azure portal から入手したテナント GUID を入力してください。 テナント GUID 以外の文字列を編集すると、認証に失敗する場合があります。

    public string AcquireToken(Identity identity, string authority, string resource, string claims)
    {
       var authorityUri = new Uri(authority);
       authority = String.Format("https://{0}/{1}", authorityUri.Host, "<Tenant-GUID>");
    
       _app = PublicClientApplicationBuilder.Create(_appInfo.ApplicationId).WithAuthority(authority).WithDefaultRedirectUri().Build();
       var accounts = (_app.GetAccountsAsync()).GetAwaiter().GetResult();
    
       // Append .default to the resource passed in to AcquireToken().
       string[] scopes = new string[] { resource[resource.Length - 1].Equals('/') ? $"{resource}.default" : $"{resource}/.default" };
       var result = _app.AcquireTokenInteractive(scopes).WithAccount(accounts.FirstOrDefault()).WithPrompt(Prompt.SelectAccount)
                  .ExecuteAsync().ConfigureAwait(false).GetAwaiter().GetResult();
    
       return result.AccessToken;
    }
    
    

ここで、SDK の Microsoft.InformationProtection.IConsentDelegate インターフェイスを拡張し、GetUserConsent() をオーバーライドまたは実装することで、同意の委任の実装を作成します。 この同意の委任はインスタンス化され、ファイル プロファイルとファイル エンジンのオブジェクトによって後で使用されます。 同意の委任には、url パラメーターで使用するためにユーザーが同意する必要があるサービスのアドレスが指定されます。 通常、委任は、サービスへのアクセスに同意することをユーザーが承諾または拒否できるように、何らかのフローを提供します。 このクイック スタートでは、Consent.Accept をハードコーディングします。

  1. 前に使用したものと同じ Visual Studio の "クラスの追加" 機能を使用して、別のクラスをプロジェクトに追加します。 今回は、[クラス名] フィールドに「ConsentDelegateImplementation」と入力します。

  2. ここで、ConsentDelegateImpl.cs を更新して、新しい同意の委任クラスを実装します。 Microsoft.InformationProtection に対する using ステートメントを追加し、IConsentDelegate を継承するようにクラスを設定します。

    class ConsentDelegateImplementation : IConsentDelegate
    {
         public Consent GetUserConsent(string url)
         {
              return Consent.Accept;
         }
    }
    
  3. 必要に応じて、ソリューションをビルドしてみて、エラーなしでコンパイルされることを確認します。

MIP SDK マネージド ラッパーを初期化する

  1. ソリューション エクスプローラーで、Main() メソッドの実装を含むプロジェクトの .cs ファイルを開きます。 既定の名前は、それが含まれるプロジェクトと同じであり、プロジェクトの作成時に指定したものです。

  2. 生成された main() の実装を削除します。

  3. マネージド ラッパーには、初期化、MipContext の作成、プロファイルの読み込み、リソースの解放に使用される静的クラス Microsoft.InformationProtection.MIP が含まれています。 File SDK 操作のためにラッパーを初期化するには、MIP.Initialize() を呼び出し、MipComponent.File を渡して、ファイル操作に必要なライブラリを読み込みます。

  4. Program.csMain() に次のコードを追加し、<application-id> を、前に作成した Microsoft Entra アプリケーションの登録の ID に置き換えます。

using System;
using System.Threading.Tasks;
using Microsoft.InformationProtection;
using Microsoft.InformationProtection.Exceptions;
using Microsoft.InformationProtection.File;
using Microsoft.InformationProtection.Protection;

namespace mip_sdk_dotnet_quickstart
{
    class Program
    {
        private const string clientId = "<application-id>";
        private const string appName = "<friendly-name>";

        static void Main(string[] args)
        {
            //Initialize Wrapper for File SDK operations
            MIP.Initialize(MipComponent.File);
            
        }
    }
}

ファイルのプロファイルとエンジンを作成する

前述のとおり、MIP API を使用する SDK クライアントには、プロファイルとエンジンのオブジェクトが必要です。 ネイティブ DLL を読み込み、プロファイルとエンジンのオブジェクトをインスタンス化するためのコードを追加することで、このクイック スタートのコーディング部分を完了します。

using System;
using System.Threading.Tasks;
using Microsoft.InformationProtection;
using Microsoft.InformationProtection.File;

namespace mip_sdk_dotnet_quickstart
{
  class Program
  {
       private const string clientId = "<application-id>";
       private const string appName = "<friendly-name>";

       static void Main(string[] args)
       {
            // Initialize Wrapper for File SDK operations.
            MIP.Initialize(MipComponent.File);

            // Create ApplicationInfo, setting the clientID from Microsoft Entra App Registration as the ApplicationId.
            ApplicationInfo appInfo = new ApplicationInfo()
            {
                 ApplicationId = clientId,
                 ApplicationName = appName,
                 ApplicationVersion = "1.0.0"
            };

            // Instantiate the AuthDelegateImpl object, passing in AppInfo.
            AuthDelegateImplementation authDelegate = new AuthDelegateImplementation(appInfo);

            // Create MipConfiguration Object
            MipConfiguration mipConfiguration = new MipConfiguration(appInfo, "mip_data", LogLevel.Trace, false);

            // Create MipContext using Configuration
            MipContext mipContext = MIP.CreateMipContext(mipConfiguration);

            // Initialize and instantiate the File Profile.
            // Create the FileProfileSettings object.
            // Initialize file profile settings to create/use local state.
            var profileSettings = new FileProfileSettings(mipContext,
                                     CacheStorageType.OnDiskEncrypted,
                                     new ConsentDelegateImplementation());

            // Load the Profile async and wait for the result.
            var fileProfile = Task.Run(async () => await MIP.LoadFileProfileAsync(profileSettings)).Result;

            // Create a FileEngineSettings object, then use that to add an engine to the profile.
            // This pattern sets the engine ID to user1@tenant.com, then sets the identity used to create the engine.
            var engineSettings = new FileEngineSettings("user1@tenant.com", authDelegate, "", "en-US");
            engineSettings.Identity = new Identity("user1@tenant.com");

            var fileEngine = Task.Run(async () => await fileProfile.AddEngineAsync(engineSettings)).Result;

            // Application Shutdown
            // handler = null; // This will be used in later quick starts.
            fileEngine = null;
            fileProfile = null;
            mipContext.ShutDown();
            mipContext = null;
       }
  }
}
  1. 次の値を使用して、貼り付けたソース コードのプレースホルダー値を置き換えます。

    プレースホルダー
    <application-id> 「MIP SDK のセットアップと構成」で登録したアプリケーションに割り当てられた Microsoft Entra アプリケーション ID (2 個のインスタンス)。 0edbblll-8773-44de-b87c-b8c6276d41eb
    <friendly-name> アプリケーションのユーザー定義のフレンドリ名。 AppInitialization
    <Tenant-GUID> Microsoft Entra テナントのテナント ID TenantID
  2. ここで、アプリケーションの最終ビルドを行い、すべてのエラーを解決します。 コードが正常にビルドされます。

次のステップ

これで、初期化コードが完成したので、次のクイック スタートに進み、MIP File SDK の操作を開始する準備ができました。