適用対象:
外部テナント (詳細)
この記事では、Microsoft Entra 外部 ID のユーザー サインアップ エクスペリエンスを顧客向けに拡張する方法について説明します。 顧客サインアップ ユーザー フローでは、イベント リスナーを使用して、属性コレクションの前かつ属性の送信時に、属性コレクション プロセスを拡張できます。
- OnAttributeCollectionStart イベントは、属性コレクション ページがレンダリングされる前に、属性コレクション ステップの開始時に発生します。 値の事前入力やブロック エラーの表示などのアクションを追加できます。
- OnAttributeCollectionSubmit イベントは、ユーザーが属性を入力して送信した後に発生します。 ユーザーのエントリを検証したり変更したりするアクションを追加できます。
属性コレクションの開始イベントと送信イベントのカスタム認証拡張機能を作成するだけでなく、イベントごとに実行するワークフロー アクションを定義する REST API を作成する必要があります。 任意のプログラミング言語、フレームワーク、ホスティング環境を使用して、REST API を作成およびホストできます。 この記事では、C# の Azure 関数の使用を簡単に開始する方法について説明します。 Azure Functions を使用すると、最初に仮想マシン (VM) を作成したり、Web アプリケーションを発行したりしなくても、サーバーレス環境でコードを実行できます。
前提条件
- Azure Functions などの Azure サービスを使うには、Azure サブスクリプションが必要です。 既存の Azure アカウントをお持ちでない場合は、無料試用版にサインアップするか、アカウントの作成時に Visual Studio サブスクリプション特典を使用できます。
- サインアップとサインインのユーザー フロー。
手順 1: カスタム認証拡張機能 REST API を作成する (Azure 関数アプリ)
この手順では、Azure Functions を使用して HTTP トリガー関数 API を作成します。 関数 API は、ユーザー フローのビジネス ロジックのソースです。 トリガー関数を作成した後、それを次のいずれかのイベント用に構成できます。
管理者アカウントを使用して Azure portal にサインインします。
Azure portal のメニューまたは ホーム ページで、[ リソースの作成] を選択します。
関数アプリを検索して選択し、[作成] を選択します。
[ 基本 ] ページで、次の表に示すように関数アプリの設定を使用します。
設定 提案された値 説明 予約 該当するサブスクリプション 新しい関数アプリを作成するサブスクリプション。 リソース グループ myResourceGroup 関数アプリを作成する、既存のリソース グループを選ぶか、新しいリソース グループの名前を選びます。 関数アプリ名 グローバルに一意の名前 新しい関数アプリを識別する名前。 有効な文字は、 a-z(大文字と小文字の区別をしない)、0-9、および-です。出版する Code コード ファイルまたは Docker コンテナーの発行オプション。 このチュートリアルでは、[ コード] を選択します。 ランタイム スタック .NET 好みのプログラミング言語。 このチュートリアルでは、 .NET を選択します。 バージョン "6 (LTS) インプロセス" .NET ランタイムのバージョン。 インプロセスは、ポータルで関数の作成と変更ができることを意味します。このガイドでは、これが推奨されます 地域 優先リージョン 関数がアクセスできる近くのリージョンまたは他のサービスの近くにある リージョン を選択します。 オペレーティング システム ウィンドウズ オペレーティング システムは、ランタイム スタックの選択に基づいて、事前に自動的に選択されます。 プランの種類 "従量課金 (サーバーレス)" Function App にどのようにリソースが割り当てられるかを定義するホスティング プラン。 [ 確認と作成 ] を選択してアプリ構成の選択を確認し、[ 作成] を選択します。 デプロイには、数分かかります。
デプロイが完了したら、[ リソースに移動 ] を選択して新しい関数アプリを表示します。
1.1 HTTP トリガー関数を作成する
これで Azure 関数アプリが作成されました。次は、HTTP 要求を使用して呼び出すアクションの HTTP トリガー関数を作成します。 HTTP トリガーは、Microsoft Entra カスタム認証拡張機能によって参照されて呼び出されます。
- 関数アプリの [概要] ページで、[関数] ウィンドウを選択し、[Azure portal で作成] で [関数の作成] を選択します。
- [ 関数の作成 ] ウィンドウで、[ 開発環境 ] プロパティを ポータルの [開発] のままにします。 [ テンプレート] で、[ HTTP トリガー] を選択します。
- [テンプレートの詳細] で、[新しい関数] プロパティに「CustomAuthenticationExtensionsAPI」と入力します。
- 承認レベルで、[関数] を選択します。
- 作成を選択します。
1.2 OnAttributeCollectionStart の HTTP トリガーを構成する
- メニューから、[ コード + テスト] を選択します。
- 実装するシナリオの下のタブ ( Continue、 Block、 または SetPrefillValues) を選択します。 コードを指定されたコード スニペットに置き換えます。
- コードを置き換えた後、上部のメニューから [ 関数 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 トリガーを構成する
- メニューから、[ コード + テスト] を選択します。
- 実装するシナリオとして、次のタブを選択します。 続行、 ブロック、 値の変更、または 検証エラー。 コードを指定されたコード スニペットに置き換えます。
- コードを置き換えた後、上部のメニューから [ 関数 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 に対する認証方法が含まれています。
Microsoft Entra 管理センターに、少なくともアプリケーション管理者および認証管理者としてサインインします。
Entra ID>外部 ID>カスタム認証拡張機能を参照します。
[ カスタム拡張機能の作成] を選択します。
[基本] で、AttributeCollectionStart イベントまたは AttributeCollectionSubmit イベントを選択し、[次へ] を選択します。 これが 前の手順の構成と一致していることを確認してください。
エンドポイント構成で、次のプロパティを入力します。
- 名前 - カスタム認証拡張機能の名前。 たとえば、属性コレクションイベントの場合。
-
ターゲット URL - Azure 関数 URL の
{Function_Url}。 - 説明 - カスタム認証拡張機能の説明。
[ 次へ] を選択します。
API 認証で、[新しいアプリ登録の作成] オプションを選択して、関数アプリを表すアプリ登録を作成します。
Azure Functions 認証イベント API など、アプリに名前を付けます。
[ 次へ] を選択します。
[ 作成] を選択すると、カスタム認証拡張機能と関連付けられているアプリケーションの登録が作成されます。
2.2 管理者の同意を付与する
カスタム認証拡張機能が作成された後は、登録済みアプリに管理者の同意を付与します。これにより、カスタム認証拡張機能が API に対する認証を行えるようになります。
- Entra ID>外部 ID>カスタム認証拡張機能を参照します。
- 一覧からカスタム認証拡張機能を選択します。
- [ 概要 ] タブで、[ アクセス許可の付与 ] ボタンを選択して、登録済みのアプリに管理者の同意を与えます。 カスタム認証拡張機能は、
client_credentialsを使い、Receive custom authentication extension HTTP requestsアクセス許可を使って Azure Function App に対する認証を行います。 [ 承諾] を選択します。
手順 3: カスタム認証拡張機能をユーザー フローに追加する
カスタム認証拡張機能を 1 つ以上のユーザー フローに関連付けることができるようになりました。
注
ユーザー フローを作成する必要がある場合は、「 顧客向けのサインアップとサインイン ユーザー フローの作成」の手順に従います。
3.1 カスタム認証拡張機能を既存のユーザー フローに追加する
Microsoft Entra 管理センターに、少なくともアプリケーション管理者および認証管理者としてサインインします
複数のテナントにアクセスできる場合は、上部メニューの [設定] アイコン
を使用して外部テナントに切り替えます。Entra ID>外部アイデンティティ>ユーザーフローを参照します。
一覧からユーザー フローを選択します。
[ カスタム認証拡張機能] を選択します。
[ カスタム認証拡張機能 ] ページでは、カスタム認証拡張機能をユーザー フローの 2 つの異なる手順に関連付けることができます。
- ユーザーから情報を収集する前に、OnAttributeCollectionStart イベントに関連付けられています。 編集 (鉛筆) を選択します。 OnAttributeCollectionStart イベント用に構成されたカスタム拡張機能のみが表示されます。 属性コレクションの開始イベント用に構成したアプリケーションを選択し、[選択] を 選択します。
- ユーザーが自分の情報を送信すると、OnAttributeCollectionSubmit イベントに関連付けられます。 OnAttributeCollectionSubmit イベント用に構成されたカスタム拡張機能のみが表示されます。 属性コレクション送信イベント用に構成したアプリケーションを選択し、[選択] を 選択します。
両方の属性コレクションの手順の横に一覧表示されているアプリケーションが正しいことを確認します。
[保存] アイコンを選択します。
ステップ 4: アプリケーションをテストする
トークンを取得してカスタム認証拡張機能をテストするには、https://jwt.ms アプリを使用できます。 これは Microsoft 所有の Web アプリケーションであり、トークンのデコードされた内容を表示します (トークンの内容がお使いのブラウザーの外に出ることはありません)。
jwt.ms Web アプリケーションを登録するには、次 の手順に 従います。
4.1 jwt.ms Web アプリケーションを登録する
- Microsoft Entra 管理センターに、少なくともアプリケーション管理者としてサインインします。
- Entra ID>のApp登録を参照します。
- [ 新しい登録] を選択します。
- アプリケーションの 名前 を入力します。 たとえば、 My Test アプリケーションです。
- [ サポートされているアカウントの種類] で、[この組織のディレクトリ内のアカウントのみ] を選択します。
- [リダイレクト URI] の [プラットフォームの選択] ドロップダウンで[Web] を選択し、[URL] テキスト ボックスに「
https://jwt.ms」と入力します。 - [ 登録 ] を選択してアプリの登録を完了します。
4.2 アプリケーション ID を取得する
アプリの登録の [ 概要] で、 アプリケーション (クライアント) ID をコピーします。 後の手順では、アプリ ID を <client_id> として参照します。 Microsoft Graph では、 appId プロパティによって参照されます。
4.3 暗黙的なフローを有効にする
jwt.ms テスト アプリケーションでは、暗黙的なフローが使用されます。 次の手順を使用して、 My Test アプリケーション の登録で暗黙的なフローを有効にします。
重要
Microsoft では、使用可能な最も安全な認証フローを使用することをお勧めします。 この手順で使用する認証フローでは、アプリケーションで非常に高い信頼度が要求されるため、他のフローには存在しないリスクが伴います。 この方法は、運用アプリに対するユーザーの認証には使用しないでください (詳細を参照)。
- [ 管理] で [ 認証] を選択します。
- [ 暗黙的な許可とハイブリッド フロー] で、 ID トークン (暗黙的およびハイブリッド フローに使用) チェック ボックスをオンにします。
- [保存] を選択します。
手順 5: Azure 関数を保護する
Microsoft Entra カスタム認証拡張機能は、サーバー間フローを使って、HTTP の Authorization ヘッダーで Azure 関数に送信されるアクセス トークンを取得します。 関数を Azure に発行するときは、特に運用環境では、Authorization ヘッダーで送信されるトークンを検証する必要があります。
Azure 関数を保護するには、次の手順に従って Microsoft Entra 認証を統合し、受信トークンを Azure Functions 認証イベント API アプリケーションの登録と検証します。
注
Azure 関数アプリが、カスタム認証拡張機能が登録されているテナントとは異なる Azure テナントでホストされている場合は、「 5.1 OpenID Connect ID プロバイダーを使用 する」の手順に進んでください。
5.1 ID プロバイダーを Azure 関数に追加する
Azure portal にサインインします。
以前に公開した関数アプリを探して選択します。
左側のメニューで [ 認証 ] を選択します。
[ ID プロバイダーの追加] を選択します。
ID プロバイダーとして Microsoft を選択します。
テナントの種類として [顧客 ] を選択します。
[アプリの登録] で、カスタム クレーム プロバイダーの登録時
client_idした Azure Functions 認証イベント API アプリ登録のを入力します。発行者 URL には、次の URL
https://{domainName}.ciamlogin.com/{tenant_id}/v2.0を入力します。-
{domainName}は外部テナントのドメイン名です。 -
{tenantId}は外部テナントのテナント ID です。 カスタム認証拡張機能をここに登録する必要があります。
-
[ 認証されていない要求] で、ID プロバイダーとして [HTTP 401 Unauthorized ] を選択します。
[トークン ストア] オプションの選択を解除します。
[ 追加] を選択して、Azure 関数に認証を追加します。
5.2 OpenID Connect ID プロバイダーの使用
手順 5: Azure 関数を保護するように構成した場合は、この手順をスキップします。 そうではなく、カスタム認証拡張機能が登録されているテナントとは異なるテナントで Azure 関数がホストされている場合は、次の手順のようにして関数を保護します。
Azure portal にサインインし、前に発行した関数アプリに移動して選択します。
左側のメニューで [ 認証 ] を選択します。
[ ID プロバイダーの追加] を選択します。
ID プロバイダーとして OpenID Connect を選択します。
Contoso Microsoft Entra ID などの名前を指定します。
[ メタデータ] エントリで、ドキュメント URL に次の URL を入力します。
{tenantId}を Microsoft Entra テナント ID に置き換えます。https://login.microsoftonline.com/{tenantId}/v2.0/.well-known/openid-configuration[アプリの登録] で、前に作成した Azure Functions 認証イベント API アプリ登録のアプリケーション ID (クライアント ID) を入力します。
Microsoft Entra 管理センターで次の手順を実行します。
- 前に作成した Azure Functions 認証イベント API アプリの登録を選択します。
- [証明書とシークレット>クライアント シークレット>新しいクライアント シークレットを選択します。
- クライアント シークレットの説明を追加します。
- シークレットの有効期限を選択するか、カスタムの有効期間を指定します。
- 追加を選択します。
- クライアント アプリケーション コードで使用する シークレットの値 を記録します。 このページからの移動後は、このシークレットの値は "二度と表示されません"。
Azure 関数に戻り、アプリの 登録で クライアント シークレットを入力します。
[トークン ストア] オプションの選択を解除します。
OpenID Connect ID プロバイダーを追加するには、[ 追加] を選択します。
手順 6: アプリケーションをテストする
次の手順に従って、カスタム認証拡張機能をテストします。
新しいプライベート ブラウザーを開き、次の 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 に置き換えます。
-
サインインすると、
https://jwt.msでデコードされたトークンが表示されます。