ブローカー認証では、システム認証ブローカーを使用してユーザー資格情報を収集し、アプリを認証します。 システム認証ブローカーは、接続されているすべてのアカウントの認証ハンドシェイクとトークンメンテナンスを管理するユーザーのマシンで実行されているアプリです。
ブローカー認証には、次の利点があります。
- Enables Single Sign-On (SSO): ユーザーがMicrosoft Entra IDで認証する方法を簡素化し、Microsoft Entra ID更新トークンを流出や誤用から保護できます。
- セキュリティ強化: 多くのセキュリティ強化がブローカーと共に提供され、アプリ ロジックを更新する必要はありません。
- 強化された機能のサポート: ブローカーの助けを借りて、開発者は豊富な OS とサービス機能にアクセスできます。
- システム統合: 組み込みのアカウント ピッカーでブローカー のプラグ アンド プレイを使用するアプリケーションにより、ユーザーは同じ資格情報を何度も再入力する代わりに、既存のアカウントをすばやく選択できます。
- トークン保護: 更新トークンがデバイスバインドされ、アプリがデバイスバインドされたアクセス トークンを取得できるようにします。 「トークン保護」を参照してください。
Windowsは、Web アカウント マネージャー (WAM) という認証ブローカーを提供します。 WAM を使用すると、Microsoft Entra IDなどの ID プロバイダーが OS にネイティブにプラグインし、セキュリティで保護されたログイン サービスをアプリに提供できます。 ブローカー認証を使用すると、対話型ログイン資格情報によって許可されるすべての操作に対してアプリが有効になります。
個人の Microsoft アカウントと職場または学校アカウントがサポートされています。 サポートされている Windows バージョンでは、既定のブラウザー ベースの UI は、組み込みのWindows アプリと同様に、よりスムーズな認証エクスペリエンスに置き換えられます。
ブローカー認証用にアプリを構成する
アプリケーションでブローカー認証を有効にするには、次の手順に従います。
Azure ポータルで、Microsoft Entra ID に移動し、左側のメニューで アプリの登録 を選択します。
アプリの登録を選択し、[ 認証] を選択します。
プラットフォーム構成を使用して、アプリ登録に適切なリダイレクト URI を追加します。
[ プラットフォームの構成] で、[ + プラットフォームの追加] を選択します。
[ プラットフォームの構成] で、アプリケーションの種類 (プラットフォーム) のタイルを選択して、 モバイル アプリケーションやデスクトップ アプリケーションなどの設定を構成します。
[カスタム リダイレクト URI] に、次のリダイレクト URI を入力します。
ms-appx-web://Microsoft.AAD.BrokerPlugin/{your_client_id}は、アプリ登録の [概要] ウィンドウのアプリケーション (クライアント) ID に置き換えます。
設定を選択します。
詳細については、「 アプリの登録にリダイレクト URI を追加する」を参照してください。
[認証] ウィンドウに戻り、[詳細設定] で [パブリック クライアント フローを許可する] で [はい] を選択します。
[保存] をクリックして変更を適用します。
特定のリソースに対してアプリケーションを承認するには、対象のリソースに移動し、API アクセス許可を選択し、アクセスする Microsoft Graph およびその他のリソースを有効にします。
Important
また、初めてサインインするときにアプリケーションに同意を付与するには、テナントの管理者である必要があります。
ロールを割り当てる
ブローカー認証でアプリ コードを正常に実行するには、Azure ロールベースのアクセス制御 (RBAC) を使用してユーザー アカウントのアクセス許可を付与します。 関連するAzure サービスの適切なロールをユーザー アカウントに割り当てます。 例えば次が挙げられます。
- Azure Blob Storage: Storage Account Data Contributor ロールを割り当てます。
- Azure Key Vault: Key Vault Secrets Officer ロールを割り当てます。
アプリを指定する場合は、user_impersonation Access Azure Storage に API アクセス許可が設定されている必要があります (前のセクションの手順 6)。 この API アクセス許可を使用すると、サインイン時に同意が付与された後、サインインユーザーに代わってAzureストレージにアクセスできます。
コードを実装する
Azure ID ライブラリは、InteractiveBrowserCredential を使用したブローカー認証をサポートします。 azure-identity-broker ライブラリは、システム認証ブローカーを使用できるエンティティを作成する機能を提供します。 たとえば、Java コンソール アプリでブローカー認証を使用して、SecretClient でAzure Key Vaultを認証するには、次の手順に従います。
ファイルにの依存関係を追加します。
<dependency> <groupId>com.azure</groupId> <artifactId>azure-identity-broker</artifactId> </dependency>アカウント ピッカー ダイアログを表示するための親ウィンドウへの参照を取得します。 例については、「 ウィンドウ ハンドルを取得する」を参照してください。
を使用してのインスタンスを作成します。
import com.azure.identity.InteractiveBrowserCredential; import com.azure.identity.broker.InteractiveBrowserBrokerCredentialBuilder; import com.azure.security.keyvault.secrets.SecretClient; import com.azure.security.keyvault.secrets.SecretClientBuilder; import com.azure.security.keyvault.secrets.models.KeyVaultSecret; long windowHandle = getWindowHandle(); // See examples below InteractiveBrowserCredential credential = new InteractiveBrowserBrokerCredentialBuilder() .setWindowHandle(windowHandle) .useDefaultBrokerAccount() .build(); SecretClient client = new SecretClientBuilder() .vaultUrl("https://<your-key-vault-name>.vault.azure.net") .credential(credential) .buildClient(); KeyVaultSecret secret = client.getSecret("MySecret"); System.out.println("Retrieved secret: " + secret.getName());
前の例では、 は、既定のシステム アカウントを使用して、サイレントのブローカー認証フローを選択します。 この方法では、ユーザーは同じアカウントを繰り返し選択する必要はありません。 サイレントなブローカー認証が失敗した場合、 は対話型の仲介型認証にフォールバックします。
次のスクリーンショットは、代替の対話型のブローカー認証エクスペリエンスを示しています。
ウィンドウ ハンドルを取得する
を使用して対話形式で認証する場合、要求を送信するウィンドウに認証ダイアログが正しく表示されるようにするには、親ウィンドウ ハンドルが必要です。
JavaFX アプリケーション
JavaFX アプリケーションの場合は、JNA (Java Native Access) を使用してウィンドウ ハンドルを取得します。
import com.sun.jna.Pointer;
import com.sun.jna.platform.win32.User32;
import com.sun.jna.platform.win32.WinDef;
public long getWindowHandle(Stage stage) {
WinDef.HWND hwnd = User32.INSTANCE.FindWindow(null, stage.getTitle());
return Pointer.nativeValue(hwnd.getPointer());
}
コンソール アプリケーション
Windows上のコンソール アプリケーションの場合は、JNA を使用してコンソール ウィンドウ ハンドルを取得します。
import com.sun.jna.Pointer;
import com.sun.jna.platform.win32.Kernel32;
import com.sun.jna.platform.win32.WinDef;
WinDef.HWND hwnd = Kernel32.INSTANCE.GetConsoleWindow();
long windowHandle = Pointer.nativeValue(hwnd.getPointer());