次の方法で共有


属性コレクションの開始および送信イベントのカスタム認証拡張機能を作成する (プレビュー)

適用対象: 灰色の X 記号がある白い円。 従業員テナント 内側に白いチェック マーク記号がある緑の円。 外部テナント (詳細情報)

この記事では、Microsoft Entra 外部 ID のユーザー サインアップ エクスペリエンスを顧客向けに拡張する方法について説明します。 顧客サインアップ ユーザー フローでは、イベント リスナーを使用して、属性コレクションの前かつ属性の送信時に、属性コレクション プロセスを拡張できます。

  • OnAttributeCollectionStart イベントは、属性コレクション ステップの開始時、かつ属性コレクション ページがレンダリングされる前に発生します。 値の事前入力やブロック エラーの表示などのアクションを追加できます。

    ヒント

    今すぐ試す

    この機能を試すには、Woodgrove Groceries のデモにアクセスし、「サインアップ属性の事前入力」 ユース ケースを開始します。

  • OnAttributeCollectionSubmit イベントは、ユーザーが属性を入力して送信した後に発生します。 ユーザーのエントリを検証したり変更したりするアクションを追加できます。

    ヒント

    今すぐ試す

    この機能を試すには、Woodgrove Groceries のデモにアクセスし、「サインアップ属性の検証」ユース ケースまたは「ユーザーがサインアップ プロセスを続行できないようにする」ユース ケースを開始します。

属性コレクションの開始イベントと送信イベントのカスタム認証拡張機能を作成するだけでなく、イベントごとに実行するワークフロー アクションを定義する REST API を作成する必要があります。 任意のプログラミング言語、フレームワーク、ホスティング環境を使用して、REST API を作成およびホストできます。 この記事では、C# の Azure 関数の使用を簡単に開始する方法について説明します。 Azure Functions を使用すると、最初に仮想マシン (VM) を作成したり、Web アプリケーションを発行したりしなくても、サーバーレス環境でコードを実行できます。

前提条件

手順 1: カスタム認証拡張機能 REST API を作成する (Azure 関数アプリ)

ヒント

この記事の手順は、開始するポータルに応じて若干異なる場合があります。

この手順では、Azure Functions を使用して HTTP トリガー関数 API を作成します。 関数 API は、ユーザー フローのビジネス ロジックのソースです。 トリガー関数を作成した後、それを次のいずれかのイベント用に構成できます。

  1. 管理者アカウントで Azure Portal にサインインします。

  2. Azure portal のメニューまたは [ホーム] ページから [リソースの作成] を選択します。

  3. [関数アプリ] を検索して選択し、[作成] を選択します。

  4. [基本] ページで、下の表に指定されている関数アプリの設定を使用します。

    設定 提案された値 説明
    サブスクリプション 該当するサブスクリプション 新しい関数アプリを作成するサブスクリプション。
    リソース グループ myResourceGroup 関数アプリを作成する、既存のリソース グループを選ぶか、新しいリソース グループの名前を選びます。
    関数アプリ名 グローバルに一意の名前 新しい関数アプリを識別する名前。 有効な文字は、a-z (大文字と小文字の区別をしない)、0-9、および -です。
    発行 コード コード ファイルまたは Docker コンテナーの発行オプション。 このチュートリアルでは、[コード] を選びます。
    ランタイム スタック .NET 好みのプログラミング言語。 このチュートリアルでは、[.NET] を選びます。
    Version "6 (LTS) インプロセス" .NET ランタイムのバージョン。 インプロセスは、ポータルで関数の作成と変更ができることを意味します。このガイドでは、これが推奨されます
    リージョン 優先リージョン 自分の近く、または関数がアクセスできる他のサービスの近くのリージョンを選択します。
    オペレーティング システム Windows オペレーティング システムは、ランタイム スタックの選択に基づいて、事前に自動的に選択されます。
    プランの種類 "従量課金 (サーバーレス)" Function App にどのようにリソースが割り当てられるかを定義するホスティング プラン。
  5. [確認および作成] を選んでアプリの構成の選択を確認した後、[作成] を選びます。 デプロイには、数分かかります。

  6. デプロイされたら、[リソースに移動] を選択して、新しい関数アプリを確認します。

1.1 HTTP トリガー関数を作成する

これで Azure 関数アプリが作成されました。次は、HTTP 要求を使用して呼び出すアクションの HTTP トリガー関数を作成します。 HTTP トリガーは、Microsoft Entra カスタム認証拡張機能によって参照されて呼び出されます。

  1. 関数アプリの [概要] ページで、[関数] ペインを選択し、[Azure portal で作成] の下にある [関数の作成] を選択します。
  2. [関数の作成] ウィンドウで、[開発環境] プロパティは [Develop in portal] (ポータルで開発) のままにします。 [テンプレート] の下にある [HTTP トリガー] を選択します。
  3. [テンプレートの詳細] で、[新しい関数] プロパティに「CustomAuthenticationExtensionsAPI」と入力します。
  4. [認証レベル][関数] を選びます。
  5. [作成] を選択します

1.2 OnAttributeCollectionStart の HTTP トリガーを構成する

  1. メニューから [Code + Test] (コードとテスト) を選択します。
  2. 実装するシナリオに合わせて、以下の [続行][ブロック]、または [SetPrefillValues] の各タブの中から選択します。 コードを指定されたコード スニペットに置き換えます。
  3. コードを置き換えたら、上部のメニューから [関数の URL の取得] を選んで、URL をコピーします。 この URL は、手順 2 のターゲット URL の「カスタム認証拡張機能を作成して登録する」で使用します。

この HTTP トリガーを使用して、追加のアクションが必要ない場合にユーザーがサインアップ フローを続行できるようにします。

#r "Newtonsoft.Json"

using System.Net;
using Microsoft.AspNetCore.Mvc;
using Microsoft.Extensions.Primitives;
using Newtonsoft.Json;
using System.Text;

public static async Task<object> Run(HttpRequest req, ILogger log)
{
    log.LogInformation("C# HTTP trigger function processed a request.");

    string requestBody = await new StreamReader(req.Body).ReadToEndAsync();
    dynamic request = JsonConvert.DeserializeObject(requestBody);


    var actions = new List<ContinueWithDefaultBehavior>{
        new ContinueWithDefaultBehavior { type = "microsoft.graph.attributeCollectionStart.continueWithDefaultBehavior"}
    };

    var dataObject = new Data {
        type = "microsoft.graph.onAttributeCollectionStartResponseData",
        actions= actions
    };

    dynamic response = new ResponseObject {
        data = dataObject
    };

    // Send the response
    return response;
}

public class ResponseObject
{
    public Data data { get; set; }
}

[JsonObject]
public class Data {
    [JsonProperty("@odata.type")]
    public string type { get; set; }
    public List<ContinueWithDefaultBehavior> actions { get; set; }
}

[JsonObject]
public class ContinueWithDefaultBehavior {
    [JsonProperty("@odata.type")]
    public string type { get; set; }
}

1.3 OnAttributeCollectionSubmit の HTTP トリガーを構成する

  1. メニューから [Code + Test] (コードとテスト) を選択します。
  2. 実装するシナリオに合わせて、以下の [続行][ブロック][値の変更][検証エラー] の各タブの中から選択します。 コードを指定されたコード スニペットに置き換えます。
  3. コードを置き換えたら、上部のメニューから [関数の URL の取得] を選んで、URL をコピーします。 この URL は、手順 2 のターゲット URL の「カスタム認証拡張機能を作成して登録する」で使用します。

この HTTP トリガーを使用して、追加のアクションが必要ない場合にユーザーがサインアップ フローを続行できるようにします。

#r "Newtonsoft.Json"

using System.Net;
using Microsoft.AspNetCore.Mvc;
using Microsoft.Extensions.Primitives;
using Newtonsoft.Json;
using System.Text;

public static async Task<object> Run(HttpRequest req, ILogger log)
{
    log.LogInformation("C# HTTP trigger function processed a request.");

    string requestBody = await new StreamReader(req.Body).ReadToEndAsync();
    dynamic request = JsonConvert.DeserializeObject(requestBody);
    
    var actions = new List<ContinueWithDefaultBehavior>{
        new ContinueWithDefaultBehavior { type = "microsoft.graph.attributeCollectionSubmit.continueWithDefaultBehavior"}
    };
						
    var dataObject = new Data {
        type = "microsoft.graph.onAttributeCollectionSubmitResponseData",
        actions= actions
    };
	    
	dynamic response = new ResponseObject {
        data = dataObject
    };

    // Send the response
    return response;
}

public class ResponseObject
{
    public Data data { get; set; }
}

[JsonObject]
public class Data {
    [JsonProperty("@odata.type")]
    public string type { get; set; }
    
    public List<ContinueWithDefaultBehavior> actions { get; set; }
}

[JsonObject]
public class ContinueWithDefaultBehavior {
    [JsonProperty("@odata.type")]
	public string type { get; set; }
}

手順 2: カスタム認証拡張機能を作成して登録する

この手順では、Azure 関数を呼び出すために Microsoft Entra ID で使用されるカスタム認証拡張機能を登録します。 カスタム認証拡張機能には、REST API エンドポイントに関する情報、REST API から解析する属性コレクションの開始アクションと送信アクション、REST API に対する認証方法が含まれています。

  1. アプリケーション管理者および認証管理者以上の権限で Microsoft Entra 管理センターにサインインします。

  2. [ID]>[外部 ID]>[カスタム認証拡張機能] に移動します。

  3. [カスタム拡張機能の作成] を選びます。

  4. [Basics] (基本) で、AttributeCollectionStart イベントまたは AttributeCollectionSubmit イベントを選択し、[次へ] を選択します。 これが前の手順の構成と一致していることを確認してください。

  5. [エンドポイントの構成] で、次のプロパティを入力します。

    • [名前] - カスタム認証拡張機能の名前。 たとえば、On Attribute Collection Event とします。
    • [ターゲット URL] - Azure 関数の URL の {Function_Url}
    • [説明] - カスタム認証拡張機能の説明。
  6. [次へ] を選択します。

  7. [API 認証][アプリの登録を新規作成する] オプションを選んで、"関数アプリ" を表すアプリ登録を作成します。

  8. アプリの名前を指定します (例: Azure Functions 認証イベント API)。

  9. [次へ] を選択します。

  10. [作成] を選択すると、カスタム認証拡張機能とそれに関連付けられているアプリケーションの登録が作成されます。

カスタム認証拡張機能が作成された後は、登録済みアプリに管理者の同意を付与します。これにより、カスタム認証拡張機能が API に対する認証を行えるようになります。

  1. [ID]>[外部 ID]>[カスタム認証拡張機能 (プレビュー)] に移動します。
  2. 一覧からカスタム認証拡張機能を選択します。
  3. [概要] タブで、[アクセス許可を付与] ボタンを選択して、登録済みアプリに管理者の同意を付与します。 カスタム認証拡張機能は、client_credentials を使い、Receive custom authentication extension HTTP requests アクセス許可を使って Azure Function App に対する認証を行います。 [Accept](承認) を選択します。

手順 3: カスタム認証拡張機能をユーザー フローに追加する

カスタム認証拡張機能を 1 つ以上のユーザー フローに関連付けることができるようになりました。

Note

ユーザー フローを作成する必要がある場合は、「顧客向けのサインアップとサインインのユーザー フローを作成する」の手順に従います。

3.1 カスタム認証拡張機能を既存のユーザー フローに追加する

  1. アプリケーション管理者および認証管理者以上の権限で Microsoft Entra 管理センターにサインインします。

  2. 複数のテナントにアクセスできる場合は、上部のメニューの [設定] アイコン を使用して、目的の外部テナントに切り替えます。

  3. [ID]>[External Identities]>[ユーザー フロー] に移動します。

  4. 一覧からユーザー フローを選択します。

  5. [カスタム認証拡張機能] を選択します。

  6. [カスタム認証拡張機能] ページでは、次の 2 つの異なる手順でカスタム認証拡張機能をユーザー フローに関連付けることができます。

    • [Before collecting information from the user] (ユーザーから情報を収集する前) は、OnAttributeCollectionStart イベントに関連付けられています。 編集 (鉛筆) を選択します。 OnAttributeCollectionStart イベント用に構成されたカスタム拡張機能のみが表示されます。 属性コレクションの開始イベント用に構成したアプリケーションを選択し、[選択] を選びます。
    • [When a user submits their information] (ユーザーが自分の情報を送信するとき) は、OnAttributeCollectionSubmit イベントに関連付けられています。 OnAttributeCollectionSubmit イベント用に構成されたカスタム拡張機能のみが表示されます。 属性コレクションの送信イベント用に構成したアプリケーションを選択し、[選択] を選びます。
  7. 両方の属性コレクションの手順の横に一覧表示されているアプリケーションが正しいことを確認します。

  8. [Save](保存) アイコンを選択します。

ステップ 4: アプリケーションをテストする

トークンを取得してカスタム認証拡張機能をテストするには、https://jwt.ms アプリを使用できます。 これは Microsoft 所有の Web アプリケーションであり、トークンのデコードされた内容を表示します (トークンの内容がお使いのブラウザーの外に出ることはありません)。

次の手順のようにして、jwt.ms Web アプリケーションを登録します。

4.1 jwt.ms Web アプリケーションを登録する

  1. アプリケーション管理者以上の権限で Microsoft Entra 管理センターにサインインします。
  2. [ID]>[アプリケーション]>[Application registrations] (アプリケーションの登録) を参照します。
  3. [新規登録] を選択します。
  4. アプリケーションの名前を入力します。 例: マイ テスト アプリケーション
  5. [サポートされているアカウントの種類] で、 [この組織のディレクトリ内のアカウントのみ] を選択します。
  6. [リダイレクト URI][プラットフォームの選択] ドロップダウンで [Web] を選び、[URL] テキスト ボックスに「https://jwt.ms」と入力します。
  7. [登録] を選んで、アプリの登録を完了します。

4.2 アプリケーション ID を取得する

アプリの登録の [概要] で、[アプリケーション (クライアント) ID] をコピーします。 後の手順では、アプリ ID を <client_id> として参照します。 Microsoft Graph では、appId プロパティによって参照されます。

4.3 暗黙的なフローを有効にする

jwt.ms テスト アプリケーションでは、暗黙的なフローを使用します。 My Test application の登録で暗黙的なフローを有効にします。

重要

Microsoft では、使用可能な最も安全な認証フローを使用することをお勧めします。 この手順で使用する認証フローでは、アプリケーションで非常に高い信頼度が要求されるため、他のフローには存在しないリスクが伴います。 この方法は、運用アプリに対するユーザーの認証には使用しないでください (詳細情報)。

  1. [管理] で、 [認証] を選択します。
  2. [暗黙的な許可およびハイブリッド フロー] で、[ID トークン (暗黙的およびハイブリッド フローに使用)] チェックボックスをオンにします。
  3. [保存] を選択します。

手順 5: Azure 関数を保護する

Microsoft Entra カスタム認証拡張機能は、サーバー間フローを使って、HTTP の Authorization ヘッダーで Azure 関数に送信されるアクセス トークンを取得します。 関数を Azure に発行するときは、特に運用環境では、Authorization ヘッダーで送信されるトークンを検証する必要があります。

Azure 関数を保護するには、受信したトークンを Azure Functions 認証イベント API アプリケーション登録で検証するため、次の手順のようにして Azure AD 認証を統合します。

Note

Azure 関数アプリが、カスタム認証拡張機能が登録されているテナントとは異なる Azure テナントでホストされている場合は、「5.1 OpenID Connect ID プロバイダーの使用」の手順に進んでください。

5.1 ID プロバイダーを Azure 関数に追加する

  1. Azure portal にサインインします。

  2. 前に発行した関数アプリに移動して選択します。

  3. 左側のメニューで [認証] を選択します。

  4. [ID プロバイダーの追加] を選びます。

  5. ID プロバイダーとして [Microsoft] を選択します。

  6. テナントの種類として [顧客] を選択します。

  7. [アプリの登録] の下に、カスタム クレーム プロバイダーの登録時に前に作成した "Azure Functions 認証イベント API" アプリ登録の client_id を入力します。

  8. [発行者 URL] に、URL https://{domainName}.ciamlogin.com/{tenant_id}/v2.0 を入力します。ここで

    • {domainName} は外部テナントのドメイン名です。
    • {tenantId} は外部テナントのテナント ID です。 カスタム認証拡張機能をここに登録する必要があります。
  9. [Unauthenticated requests] (認証されていない要求) で、ID プロバイダーとして [HTTP 401 認可されていない] を選びます。

  10. [トークン ストア] オプションをオフにします。

  11. [追加] を選んで、Azure 関数に認証を追加します。

    外部テナントにいる間に関数アプリに認証を追加する方法を示すスクリーンショット。

5.2 OpenID Connect ID プロバイダーの使用

手順 5: Azure 関数を保護する」が構成済みの場合は、この手順をスキップします。 そうではなく、カスタム認証拡張機能が登録されているテナントとは異なるテナントで Azure 関数がホストされている場合は、次の手順のようにして関数を保護します。

  1. Azure portal にサインインしてから、前に発行した関数アプリに移動して選択します。

  2. 左側のメニューで [認証] を選択します。

  3. [ID プロバイダーの追加] を選びます。

  4. ID プロバイダーとして [OpenID Connect] を選びます。

  5. Contoso Microsoft Entra ID などの名前を指定します。

  6. [メタデータ エントリ] で、[ドキュメントの URL] に次の URL を入力します。 {tenantId} を Microsoft Entra テナント ID に置き換えます。

    https://login.microsoftonline.com/{tenantId}/v2.0/.well-known/openid-configuration
    
  7. [アプリの登録] で、前に作成した "Azure Functions 認証イベント API" アプリ登録のアプリケーション ID (クライアント ID) を入力します。

  8. Microsoft Entra 管理センターで次の手順を実行します。

    1. 前に作成した "Azure Functions 認証イベント API" アプリの登録を選択します。
    2. [証明書とシークレット]>[Client secrets]\(クライアント シークレット\)>[新しいクライアント シークレット] の順に選択します。
    3. クライアント シークレットの説明を追加します。
    4. シークレットの有効期限を選択するか、カスタムの有効期間を指定します。
    5. [追加] を選択します。
    6. クライアント アプリケーションのコードで使用できるように、シークレットの値を記録しておきます。 このページからの移動後は、このシークレットの値は "二度と表示されません"。
  9. Azure 関数に戻り、[アプリの登録][クライアント シークレット] を入力します。

  10. [トークン ストア] オプションをオフにします。

  11. [追加] を選んで、OpenID Connect ID プロバイダーを追加します。

手順 6: アプリケーションをテストする

次の手順に従って、カスタム認証拡張機能をテストします。

  1. 新しいプライベート ブラウザーを開き、次の URL に移動します。

    https://<domainName>.ciamlogin.com/<tenant_id>/oauth2/v2.0/authorize?client_id=<client_id>&response_type=code+id_token&redirect_uri=https://jwt.ms&scope=openid&state=12345&nonce=12345
    
    • <domainName> を外部テナント名に置き換え、<tenant-id> を外部テナント ID に置き換えます。
    • <client_id> をユーザー フローに追加したアプリケーションの ID に置き換えます。
  2. サインインすると、https://jwt.ms でデコードされたトークンが表示されます。

次のステップ