次の方法で共有


Microsoft Entra を使用してテナント間承認を構成する

セキュリティ上の理由から、サーバーは Azure SignalR Service リソースから独立したテナントでホストされる場合があります。 マネージド ID はテナント間で使用できないため、テナント A にアプリケーションを登録し、テナント B にエンタープライズ アプリケーションとしてプロビジョニングする必要があります。この記事では、テナント A にアプリケーションを作成し、それを使用してテナント B の Azure SignalR Service リソースに接続する方法について説明します。

テナント A にマルチテナント アプリケーションを登録する

最初の手順では、マルチテナント アプリケーションを作成します。 詳細については、「 クイック スタート: Microsoft Entra ID にアプリケーションを登録する」を参照してください。

シングル テナント アプリケーションが既にある場合は、「 Microsoft Entra ID でシングルテナント アプリをマルチテナントに変換する」の手順に従います。

次の 4 種類のアカウントがあります。

  • この組織ディレクトリ内のアカウント
  • 任意の組織のディレクトリ内のアカウント
  • 任意の組織のディレクトリ内のアカウントと個人用の Microsoft アカウント
  • 個人用 Microsoft アカウント

アプリケーションを作成するときは、必ず 2 番目の種類または 3 番目の種類を選択してください。

登録済みアプリケーションの情報の概要を示すスクリーンショット

次の手順で使用するアプリケーション (クライアント) ID とディレクトリ (テナント) ID をメモしておきます。

テナント B でアプリケーションをプロビジョニングする

他のテナントに登録されているアプリケーションにロールを割り当てることはできません。 テナント B で外部エンタープライズ アプリケーションとしてプロビジョニングする必要があります。詳細な情報が必要な場合は、 アプリの登録とエンタープライズ アプリケーションの違いについて学習できます。

簡単に言うと、エンタープライズ アプリケーションはサービス プリンシパルであり、アプリの登録は行われません。 エンタープライズ アプリケーションは、アプリケーション (クライアント) ID など、アプリケーション オブジェクトから特定のプロパティを継承します。

既定のサービス プリンシパルは、アプリが登録されているテナントに作成されます。 他のテナントの場合は、エンタープライズ アプリケーション サービス プリンシパルを取得するためにアプリをプロビジョニングする必要があります。 詳細については、「Microsoft Entra IDでマルチテナント アプリケーションからエンタープライズ アプリケーションを作成する」を参照してください。

異なるテナント内のエンタープライズ アプリケーションは、ディレクトリ (テナント) ID が異なりますが、同じアプリケーション (クライアント) ID を共有します。

エンタープライズ アプリケーションにロールを割り当てる

テナント B にエンタープライズ アプリケーションをプロビジョニングしたら、それにロールを割り当てることができます。

次の手順では、SignalR App Server ロールを Azure SignalR Service リソースのサービス プリンシパルまたはマネージド ID に割り当てる方法について説明します。 詳細な手順については、「Azure portal を使用して Azure ロールを割り当てる」を参照してください。

管理グループ、サブスクリプション、リソース グループ、単一リソースなど、任意のスコープにロールを割り当てることができます。 スコープの詳細については、「Azure RBAC のスコープについて」を参照してください。

  1. Azure portal で、Azure SignalR Service リソースに移動します。

  2. 左のペインで アクセスの制御 (IAM) を選択します。

  3. [追加>][ロール割り当ての追加] の順に選択します。

    アクセス制御ページと、ロールの割り当てを追加するための選択を示すスクリーンショット。

  4. [ロール] タブで、[SignalR App Server]\(SignalR アプリ サーバー\) を選択します。 その他の Azure SignalR Service 組み込みロールは、シナリオによって異なります。

    役割 説明 利用事例
    SignalR アプリ サーバー サーバー接続を作成し、キーを生成する API へのアクセス。 Azure SignalR リソースが既定モードで実行されているアプリ サーバーでよく使用されます。
    SignalR Service 所有者 REST API、サーバー接続を作成する API、キー/トークンを生成する API など、すべてのデータ プレーン API へのフル アクセス。 サーバーレス モードで実行されている Azure SignalR Service リソースを持つネゴシエーション サーバーに使用されます。 REST API のアクセス許可と認証 API のアクセス許可の両方が必要です。
    SignalR REST API 所有者 データプレーン REST API へのフル アクセス。 Azure SignalR Management SDK で接続とグループを管理するために使用されますが、サーバー接続やネゴシエーション要求の処理は行われません
    SignalR REST API リーダー データプレーン REST API への読み取り専用アクセス。 読み取り専用 REST API を呼び出す監視ツールを作成するときに使用されます。
  5. [次へ] を選択します。

  6. Microsoft Entra アプリケーションの場合:

    1. [ アクセス権の割り当て ] 行で、[ ユーザー、グループ、またはサービス プリンシパル] を選択します。
    2. [ メンバー ] 行で、[ メンバーの選択] を選択し、ポップアップ ウィンドウで ID を選択します。
  7. Azure リソースのマネージド ID の場合:

    1. [ アクセスの割り当て] 行で 、[ マネージド ID] を選択します。
    2. [ メンバー ] 行で、[ メンバーの選択] を選択し、ポップアップ ウィンドウでアプリケーションを選択します。
  8. [次へ] を選択します。

  9. 割り当てを確認してから、[レビューと割り当て] を選んでロールの割り当てを確定します。

重要

新しく追加されたロールの割り当ては、反映されるまでに最大 30 分かかる場合があります。

Azure ロールを割り当てて管理する方法の詳細については、以下を参照してください。

エンタープライズ アプリケーションを使用するように Azure SignalR Service SDK を構成する

アプリケーションは、3 種類の資格情報を使用して自身を認証します。

  • 証明 書
  • クライアント シークレット
  • フェデレーテッドアイデンティティ

テナント間要求を行うには、証明書またはクライアント シークレットを使用することを強くお勧めします。

証明書またはクライアント シークレットを使用する

  • tenantId パラメーターは、テナント B の ID です。
  • 両方のテナントの clientId パラメーターは等しくなります。
  • clientSecretパラメーターとclientCert パラメーターは、テナント A で構成されます。詳細については、「資格情報の追加」を参照してください。

テナント ID がわからない場合は、「 Microsoft Entra テナントの検索」を参照してください。

services.AddSignalR().AddAzureSignalR(option =>
{
    var credential1 = new ClientSecretCredential("tenantId", "clientId", "clientSecret");
    var credential2 = new ClientCertificateCredential("tenantId", "clientId", "path-to-cert");

    option.Endpoints = new ServiceEndpoint[]
    {
        new ServiceEndpoint(new Uri("https://<resource1>.service.signalr.net"), credential1),
        new ServiceEndpoint(new Uri("https://<resource2>.service.signalr.net"), credential2),
    };
});

フェデレーション ID を使用する

セキュリティ上の理由から、サブスクリプションで証明書とクライアント シークレットが無効になっている可能性があります。 この場合は、外部 ID プロバイダーを使用するか、マネージド ID のプレビュー サポートを試す必要があります。 詳細については、以下を参照してください。

詳細とビデオ ガイダンスについては、「 Microsoft Entra Cross-Tenant Application Federated Identity Credential (FIC)」を参照してください。

ID プロバイダーとしてマネージド ID を使用する場合、コードは次の例のようになります。

  • tenantId パラメーターは、テナント B の ID です。
  • 両方のテナントの clientId パラメーターは等しくなります。
services.AddSignalR().AddAzureSignalR(option =>
{
    var msiCredential = new ManagedIdentityCredential("msiClientId");

    var credential = new ClientAssertionCredential("tenantId", "appClientId", async (ctoken) =>
    {
        // Entra ID US Government: api://AzureADTokenExchangeUSGov
        // Entra ID China operated by 21Vianet: api://AzureADTokenExchangeChina
        var request = new TokenRequestContext([$"api://AzureADTokenExchange/.default"]);
        var response = await msiCredential.GetTokenAsync(request, ctoken).ConfigureAwait(false);
        return response.Token;
    });

    option.Endpoints = [
        new ServiceEndpoint(new Uri(), "https://<resource>.service.signalr.net"), credential);
    ];
});

外部 ID プロバイダーを使用する場合、コードは次の例のようになります。

services.AddSignalR().AddAzureSignalR(option =>
{
    var credential = new ClientAssertionCredential("tenantId", "appClientId", async (ctoken) =>
    {
        // Find your own way to get a token from the external identity provider.
        // The audience of the token should be "api://AzureADTokenExchange" because it is the recommended value.
        return "TheTokenYouGetFromYourExternalIdentityProvider";
    });

    option.Endpoints = [
        new ServiceEndpoint(new Uri(), "https://<resource>.service.signalr.net"), credential);
    ];
});

Azure SignalR Service SDK を使用したトークン取得のデバッグは、トークンの結果に依存するため、困難です。 Azure SignalR Service SDK と統合する前に、トークン取得プロセスをローカルでテストすることをお勧めします。

var assertion = new ClientAssertionCredential("tenantId", "appClientId", async (ctoken) =>
{
    // Find your own way to get a token from the external identity provider.
    // The audience of the token should be "api://AzureADTokenExchange" because it is the recommended value.
    return TheTokenYouGetFromYourExternalIdentityProvider;
});

var request = new TokenRequestContext(["https://signalr.azure.com/.default");
var token = await assertion.GetTokenAsync(assertion);
Console.log(token.Token);

重要なポイントは、内部資格情報を使用して、api://AzureADTokenExchangeまたはその他の信頼された ID プラットフォームからclientAssertion パラメーターを取得することです。 次に、それを使用して、リソースにアクセスするために https://signalr.azure.com/.default 対象ユーザーとトークンを交換します。

目標は、次の要求を含むトークンを取得することです。 トークンのデコードに役立つ jwt.io を使用します。

  • oid: 値はエンタープライズ アプリケーション オブジェクト ID と等しい必要があります。 取得する場所がわからない場合は、「 エンタープライズ オブジェクト ID の取得」を参照してください。
  • tid: 値はテナント B のディレクトリ ID と同じである必要があります。テナント ID がわからない場合は、「 Microsoft Entra テナントの検索」を参照してください。
  • 対象ユーザー: Azure SignalR Service リソースにアクセスするには、対象ユーザーが https://signalr.azure.com/.default されている必要があります。