次の方法で共有


Microsoft Entra と Semantic Kernel SDK を使用して Azure OpenAI に対して App Service を認証および承認する

この記事では、Microsoft Entra のマネージド ID を使用して、Azure OpenAI リソースに対して App Service アプリケーションを認証および承認する方法を示します。

また、この記事では、Semantic Kernel SDK を使用して、.NET アプリケーションに Microsoft Entra 認証を簡単に実装する方法も示します。

Microsoft Entra のマネージド ID を使用すると、App Service アプリケーションでは、シークレットを手動でプロビジョニングまたはローテーションしなくても、保護された Azure OpenAI リソースに簡単にアクセスできます。

前提条件

App Service にマネージド ID を追加する

アプリケーションには 2 種類の ID を付与できます。

  • システム割り当て ID はアプリケーションに関連付けられているため、アプリが削除されると削除されます。 1 つのアプリに割り当てることができるシステム割り当て ID は 1 つだけです。
  • ユーザー割り当て ID は、アプリに割り当てることができるスタンドアロン Azure リソースです。 アプリは複数のユーザー割り当て ID を持つことができます。

システム割り当て ID を追加する

  1. Azure portal でアプリのページに移動し、[設定] グループまで下にスクロールします。
  2. [ID] を選択します。
  3. [システム割り当て] タブで、[状態][オン] に切り替え、[保存] を選択します。

az webapp identity assignコマンドを実行して、システム割り当て ID を作成します。

az webapp identity assign --name <appName> --resource-group <groupName>

ユーザー割り当て ID を追加する

ユーザー割り当て ID をアプリに追加するには、ID を作成し、そのリソース識別子をアプリの構成に追加します。

  1. これらの手順に従って、ユーザー割り当てマネージド ID リソースを作成します。

  2. アプリのページの左側のナビゲーション ウィンドウで、[設定] グループまで下にスクロールします。

  3. [ID] を選択します。

  4. [ユーザー割り当て済み]>[追加] を選びます。

  5. 先ほど作成した ID を見つけて選択し、[追加] を選択します。

    重要

    [追加] を選択すると、アプリが再起動します。

  1. ユーザー割り当て ID を作成する:

    az identity create --resource-group <groupName> --name <identityName>
    
  2. ID をアプリに割り当てる:

    az webapp identity assign --resource-group <groupName> --name <appName> --identities <identityId>
    

Azure OpenAI ユーザー ロールをマネージド ID に追加する

  1. Azure portal で、Azure OpenAI へのアクセス権を付与するスコープに移動します。 このスコープには、管理グループサブスクリプションリソース グループ、または特定の Azure OpenAI リソースがあります。
  2. 左側のナビゲーション ウィンドウで [アクセス制御 (IAM)] を選択します。
  3. [追加] を選択し、 [ロールの割り当ての追加] を選択します。
  4. [ロール] タブで、[Cognitive Services OpenAI User] (Cognitive Services OpenAI ユーザー) ロールを選択します。
  5. [メンバー] タブで、マネージド ID を選択します。
  6. [確認と 割り当て] タブで、 [確認と割り当て] を選択して ロールを割り当てます。

リソースのスコープ

az role assignment create --assignee "<managedIdentityObjectID>" \
--role "Cognitive Services OpenAI User" \
--scope "/subscriptions/<subscriptionId>/resourcegroups/<resourceGroupName>/providers/<providerName>/<resourceType>/<resourceSubType>/<resourceName>"

リソース グループのスコープ

az role assignment create --assignee "<managedIdentityObjectID>" \
--role "Cognitive Services OpenAI User" \
--scope "/subscriptions/<subscriptionId>/resourcegroups/<resourceGroupName>"

サブスクリプションのスコープ

az role assignment create --assignee "<managedIdentityObjectID>" \
--role "Cognitive Services OpenAI User" \
--scope "/subscriptions/<subscriptionId>"

管理グループ スコープ

az role assignment create --assignee "<managedIdentityObjectID>" \
--role "Cognitive Services OpenAI User" \
--scope "/providers/Microsoft.Management/managementGroups/<managementGroupName>"

Semantic Kernel SDK を使用してトークン ベースの認証を実装する

  1. DefaultAzureCredential オブジェクトを初期化して、アプリのマネージド ID を想定します。

    // Initialize a DefaultAzureCredential.
    // This credential type will try several authentication flows in order until one is available.
    // Will pickup Visual Studio or Azure CLI credentials in local environments.
    // Will pickup managed identity credentials in production deployments.
    TokenCredential credentials = new DefaultAzureCredential(
        new DefaultAzureCredentialOptions
        {
            // If using a user-assigned identity specify either:
            // ManagedIdentityClientId or ManagedIdentityResourceId.
            // e.g.: ManagedIdentityClientId = "myIdentityClientId".
        }
    );
    
  2. Azure OpenAI チャット入力候補サービスを含む Kernel オブジェクトを作成し、以前に作成した資格情報を使用します。

    // Retrieve the endpoint and deployment obtained from the Azure OpenAI deployment.
    // Must use the deployment name not the underlying model name.
    IConfigurationRoot config = new ConfigurationBuilder().AddUserSecrets<Program>().Build();
    string endpoint = config["AZURE_OPENAI_ENDPOINT"]!;
    string deployment = config["AZURE_OPENAI_GPT_NAME"]!;
    
    // Build a Kernel that includes the Azure OpenAI Chat Completion Service.
    // Include the previously created token credential.
    Kernel kernel = Kernel
        .CreateBuilder()
        .AddAzureOpenAIChatCompletion(deployment, endpoint, credentials)
        .Build();
    
  3. Kernel オブジェクトを使用して、Azure OpenAI を介してプロンプト入力候補を呼び出します。

    // Use the Kernel to invoke prompt completion through Azure OpenAI.
    // The Kernel response will be null if the model can't be reached.
    string? result = await kernel.InvokePromptAsync<string>("Please list three Azure services");
    Console.WriteLine($"Output: {result}");
    
    // Continue sending and receiving messages between the user and AI.
    // ...