ブローカー認証を使用したローカル開発中に Azure サービスに対して .NET アプリを認証する

ブローカー認証では、システム認証ブローカーを使用してユーザー資格情報を収集し、アプリを認証します。 システム認証ブローカーは、接続されているすべてのアカウントの認証ハンドシェイクとトークンメンテナンスを管理するユーザーのマシンで実行されているアプリです。

ブローカー認証には、次の利点があります。

  • シングル Sign-On (SSO) を有効にします。 アプリを使用すると、ユーザーが Microsoft Entra ID を使用して認証する方法を簡略化し、流出や誤用から Microsoft Entra ID 更新トークンを保護できます。
  • セキュリティ強化: 多くのセキュリティ強化がブローカーと共に提供され、アプリ ロジックを更新する必要はありません。
  • 強化された機能のサポート: ブローカーの助けを借りて、開発者は豊富な OS とサービス機能にアクセスできます。
  • システム統合: 組み込みのアカウント ピッカーでブローカー のプラグ アンド プレイを使用するアプリケーションにより、ユーザーは同じ資格情報を何度も再入力する代わりに、既存のアカウントをすばやく選択できます。
  • トークン保護: 更新トークンがデバイスバインドされ、アプリがデバイスバインドされたアクセス トークンを取得できるようにします。 「トークン保護」を参照してください。

Windows には、 Web アカウント マネージャー (WAM) と呼ばれる認証ブローカーが用意されています。 WAM を使用すると、Microsoft Entra ID などの ID プロバイダーが OS にネイティブにプラグインし、セキュリティで保護されたログイン サービスをアプリに提供できます。 ブローカー認証を使用すると、対話型ログイン資格情報によって許可されるすべての操作に対してアプリが有効になります。

個人の Microsoft アカウントと職場または学校アカウントがサポートされています。 サポートされている Windows バージョンでは、既定のブラウザー ベースの UI は、組み込みの Windows アプリと同様に、よりスムーズな認証エクスペリエンスに置き換えられます。

macOS には、組み込みの認証ブローカーがネイティブに含まれていません。 Azure Identity クライアント ライブラリは、プラットフォーム固有のメカニズムを使用してブローカー認証機能を実装し、デバイスが管理されている場合に Microsoft ポータル サイトなどのアプリと統合される場合があります。 詳細については、 Apple デバイス用の Microsoft Enterprise SSO プラグインに関するページを参照してください。

Linux では、Linux 用の Microsoft シングル サインオン を認証ブローカーとして使用します。

ブローカー認証用にアプリを構成する

アプリケーションでブローカー認証を有効にするには、次の手順に従います。

  1. Azure portal で Microsoft Entra ID に移動し、左側のメニューで [アプリの登録] を選択します。

  2. アプリの登録を選択し、[ 認証] を選択します。

  3. プラットフォーム構成を使用して、アプリ登録に適切なリダイレクト URI を追加します。

    1. [ プラットフォームの構成] で、[ + プラットフォームの追加] を選択します。

    2. [ プラットフォームの構成] で、アプリケーションの種類 (プラットフォーム) のタイルを選択して、 モバイル アプリケーションやデスクトップ アプリケーションなどの設定を構成します。

    3. [カスタム リダイレクト URI] に、プラットフォームの次のリダイレクト URI を入力します。

      Platform リダイレクト URI
      Windows 10 以降または WSL ms-appx-web://Microsoft.AAD.BrokerPlugin/{your_client_id}
      macOS msauth.com.msauth.unsignedapp://auth 署名されていないアプリの場合
      msauth.{bundle_id}://auth 署名済みアプリの場合
      Linux https://login.microsoftonline.com/common/oauth2/nativeclient

      {your_client_id}または{bundle_id}を、アプリ登録の [概要] ウィンドウのアプリケーション (クライアント) ID に置き換えます。

    4. 設定を選択します。

    詳細については、「 アプリの登録にリダイレクト URI を追加する」を参照してください。

  4. [認証] ウィンドウに戻り、[詳細設定] で [パブリック クライアント フローを許可する] で [はい] を選択します。

  5. [保存] をクリックして変更を適用します。

  6. 特定のリソースに対してアプリケーションを承認するには、対象のリソースに移動し、[ API のアクセス許可] を選択して、 アクセスする Microsoft Graph やその他のリソースを有効にします。

    Important

    また、初めてサインインするときにアプリケーションに同意を付与するには、テナントの管理者である必要があります。

ロールを割り当てる

ブローカー認証でアプリ コードを正常に実行するには、 Azure ロールベースのアクセス制御 (RBAC) を使用してユーザー アカウントのアクセス許可を付与します。 関連する Azure サービスのユーザー アカウントに適切なロールを割り当てます。 例えば次が挙げられます。

  • Azure Blob Storage: ストレージ アカウント データ共同作成者 ロールを割り当てます。
  • Azure Key Vault: Key Vault Secrets Officer ロールを割り当てます。

アプリを指定する場合は、 user_impersonation Access Azure Storage に対して API アクセス許可が設定されている必要があります (前のセクションの手順 6)。 この API アクセス許可を使用すると、サインイン中に同意が付与された後、サインインしたユーザーに代わってアプリが Azure Storage にアクセスできるようになります。

コードを実装する

Azure ID ライブラリでは、 InteractiveBrowserCredentialを使用したブローカー認証がサポートされています。 たとえば、MAUI アプリで InteractiveBrowserCredential を使用して、 SecretClientを使用して Azure Key Vault に対する認証を行うには、次の手順に従います。

Azure ID ライブラリは、 InteractiveBrowserCredentialを使用した対話型のブローカー認証を提供します。 たとえば、コンソール アプリで InteractiveBrowserCredential を使用して、 SecretClientを使用して Azure Key Vault に対する認証を行うには、次の手順に従います。

  1. Azure.Identity パッケージと Azure.Identity.Broker パッケージをインストールします。

    dotnet add package Azure.Identity
    dotnet add package Azure.Identity.Broker
    
  2. アカウント ピッカー ダイアログがすぐ上に表示される親ウィンドウへの参照を取得します。

  3. InteractiveBrowserCredentialを使用してInteractiveBrowserCredentialBrokerOptionsのインスタンスを作成します。

// Get the parent window handle for MAUI on Windows
Microsoft.Maui.Controls.Window? parentWindow = this.GetParentWindow();
Microsoft.UI.Xaml.Window? windowHandle = parentWindow?.Handler?.PlatformView as Microsoft.UI.Xaml.Window;
IntPtr hwnd = windowHandle != null ? WinRT.Interop.WindowNative.GetWindowHandle(windowHandle) : IntPtr.Zero;

// Configure InteractiveBrowserCredentialBrokerOptions with parent window reference
InteractiveBrowserCredentialBrokerOptions options = new(hwnd)
{
    UseDefaultBrokerAccount = true,
};

// Create credential that will use WAM broker on Windows
InteractiveBrowserCredential credential = new(options);

SecretClient client = new(new Uri(KeyVaultUrl), credential);
KeyVaultSecret secret = await client.GetSecretAsync(SecretName);
  1. Azure.Identity パッケージと Azure.Identity.Broker パッケージをインストールします。

    dotnet add package Azure.Identity
    dotnet add package Azure.Identity.Broker
    

    注

    macOS のサポートは、 Azure.Identity.Broker バージョン 1.3.0 以降に存在します。

  2. アカウントピッカーダイアログを表示するための親ウィンドウへの参照を取得します。

  3. InteractiveBrowserCredentialを使用してInteractiveBrowserCredentialBrokerOptionsのインスタンスを作成します。

// Get the parent window handle for MAUI on Mac Catalyst
Microsoft.Maui.Controls.Window? parentWindow = this.GetParentWindow();
UIWindow? uiWindow = parentWindow?.Handler?.PlatformView as UIWindow;
IntPtr hwnd = uiWindow != null ? uiWindow.Handle : IntPtr.Zero;

// Configure InteractiveBrowserCredentialBrokerOptions with parent window reference
InteractiveBrowserCredentialBrokerOptions options = new(hwnd)
{
    UseDefaultBrokerAccount = true,
};

// Create credential that will use the broker on macOS
InteractiveBrowserCredential credential = new(options);

SecretClient client = new(new Uri(KeyVaultUrl), credential);
KeyVaultSecret secret = await client.GetSecretAsync(SecretName);
  1. Azure.Identity パッケージと Azure.Identity.Broker パッケージをインストールします。

    dotnet add package Azure.Identity
    dotnet add package Azure.Identity.Broker
    

    注

    Linux サポートは、 Azure.Identity.Broker バージョン 1.3.0 以降に存在します。

  2. アカウントピッカーダイアログを表示するための親ウィンドウへの参照を取得します。

  3. InteractiveBrowserCredentialを使用してInteractiveBrowserCredentialBrokerOptionsのインスタンスを作成します。

    /// <summary>
    /// Get the handle of the console window for Linux
    /// </summary>
    [DllImport("libX11")]
    static extern IntPtr XOpenDisplay(string? display);
    
    [DllImport("libX11")]
    static extern IntPtr XRootWindow(IntPtr display, int screen);
    
    try
    {
        IntPtr parentWindowHandle = XRootWindow(XOpenDisplay(null), 0);
        Func<IntPtr> consoleWindowHandleProvider = () => parentWindowHandle;
    
        InteractiveBrowserCredentialBrokerOptions options = new(parentWindowHandle)
        {
            UseDefaultBrokerAccount = true,
        };
        
        // Create the InteractiveBrowserCredential using broker support
        InteractiveBrowserCredential credential = new(options);
    
        Uri vaultUri = new("https://<your-key-vault-name>.vault.azure.net/");
        SecretClient client = new(vaultUri, credential);
    
        Console.WriteLine("Retrieving secret 'MySecret' from Key Vault...");
        KeyVaultSecret secret = await client.GetSecretAsync("MySecret");
    
        return 0;
    }
    

ヒント

.NET docs GitHub リポジトリで 完全なサンプル アプリ コード を表示します。

前の例では、プロパティ UseDefaultBrokerAccount は true に設定され、既定のシステム アカウントを使用してサイレントのブローカー認証フローを選択します。 この方法では、ユーザーは同じアカウントを繰り返し選択する必要はありません。 サイレント認証、仲介型認証が失敗した場合、または UseDefaultBrokerAccount が falseに設定されている場合、 InteractiveBrowserCredential 対話型の仲介型認証にフォールバックします。

次のスクリーンショットは、代替の対話型のブローカー認証エクスペリエンスを示しています。

ブローカー対応の InteractiveBrowserCredential インスタンスを使用してユーザーを認証するときの Windows サインイン エクスペリエンスを示すスクリーンショット。

次のスクリーンショットは、代替の対話型のブローカー認証エクスペリエンスを示しています。

ブローカー対応 InteractiveBrowserCredential インスタンスを使用してユーザーを認証するときの macOS サインイン エクスペリエンスを示すスクリーンショット。

次のビデオでは、代替の対話型の仲介型認証エクスペリエンスを示します。

ブローカー対応 InteractiveBrowserCredential インスタンスを使用してユーザーを認証するときの Linux サインイン エクスペリエンスを示すアニメーション GIF。