建立屬性收集開始和提交事件的自訂驗證延伸模組 (預覽)
適用於: 員工租用戶 外部租用戶 (深入了解)
本文描述如何在 Microsoft Entra 外部 ID 中為客戶延伸使用者註冊體驗。 在客戶註冊使用者流程中,事件接聽程式可用來在屬性收集之前以及屬性提交時延伸屬性收集程序:
OnAttributeCollectionStart 事件會在屬性收集步驟的開頭,於屬性收集頁面呈現之前發生。 您可以新增預先填入值和顯示封鎖錯誤之類的動作。
OnAttributeCollectionSubmit 事件會在使用者輸入並提交屬性之後發生。 您可以新增動作,例如驗證或修改使用者的項目。
除了為屬性收集開始和提交事件建立自訂驗證延伸模組之外,您還需要建立 REST API,以定義要針對每個事件採取的工作流程動作。 您可以使用任何程式設計語言、架構和裝載環境來建立及裝載 REST API。 本文示範開始使用 C# Azure 函式的快速方法。 Azure Functions 可讓您在無伺服器環境中執行程式碼,而不需要先建立虛擬機器 (VM) 或發佈 Web 應用程式。
必要條件
- 若要使用 Azure 服務,包括 Azure Functions,您需要 Azure 訂用帳戶。 如果沒有現有的 Azure 帳戶,您可以註冊以取得免費試用帳戶,或是在建立帳戶時使用您的 Visual Studio 訂用帳戶權益。
- 註冊和登入使用者流程。
步驟 1:建立自訂驗證延伸模組 REST API (Azure 函式應用程式)
提示
根據您從中開始的入口網站,本文中的步驟可能會略有不同。
在此步驟中,您會使用 Azure Functions 來建立 HTTP 觸發程序函式 API。 函式 API 是使用者流程商務邏輯的來源。 建立觸發程序函式之後,您可以針對下列其中一個事件進行設定:
使用系統管理員帳戶登入 Azure 入口網站。
從 Azure 入口網站功能表或 [首頁] 頁面,選取 [建立資源]。
搜尋並選取函式應用程式,然後選取 [建立]。
在 [基本] 頁面中,使用下表中指定的函式應用程式設定。
設定 建議的值 描述 訂用帳戶 您的訂用帳戶 將在其中建立新函式應用程式的訂用帳戶。 資源群組 myResourceGroup 選取現有的資源群組,或要建立函數應用程式的新資源群組名稱。 函數應用程式名稱 全域唯一的名稱 識別新函數應用程式的名稱。 有效的字元是 a-z
(不區分大小寫)、0-9
和-
。發行 代碼 發佈程式碼檔案或 Docker 容器的選項。 在本教學課程中,請選取 [程式碼]。 執行階段堆疊 .NET 您慣用的程式設計語言。 在本教學課程中,請選取 [.NET]。 版本 6 (LTS) 同處理序 .NET 執行階段的版本。 同處理序表示您可以在入口網站中建立和修改函式,這是本指南建議的作法 區域 慣用區域 選取的區域應靠近您或靠近函式能夠存取的其他服務。 作業系統 Windows 系統會根據您的執行階段堆疊選項預先選取作業系統。 方案類型 使用量 (無伺服器) 定義如何將資源配置給函式應用程式的主控方案。 選取 [檢閱 + 建立],以檢閱應用程式設定選項,然後選取 [建立]。 部署需要幾分鐘的時間。
部署後,請選取 [前往資源] 以檢視新的函式應用程式。
1.1 建立 HTTP 觸發程序函式
現在您已建立 Azure 函式應用程式,接下來會針對您想要使用 HTTP 要求叫用的動作建立 HTTP 觸發程序函式。 HTTP 觸發程序是由您的 Microsoft Entra 自訂驗證延伸模組參考和呼叫。
- 在函式應用程式的 [概觀] 頁面中,選取 [函式] 窗格,然後選取 [在 Azure 入口網站中建立] 底下的 [建立函式]。
- 在 [建立函數] 視窗中,將 [開發環境] 屬性保留為 [在入口網站中開發]。 在 [範本] 底下,選取 [HTTP 觸發程序]。
- 在 [範本詳細資料] 下,為 [新函式] 屬性輸入 CustomAuthenticationExtensionsAPI。
- 針對 [授權層級],選取 [函數]。
- 選取 建立。
1.2 設定 OnAttributeCollectionStart 的 HTTP 觸發程序
- 從功能表選取 [編碼 + 測試]。
- 針對您要實作的案例,選取下列索引標籤:[繼續]、[封鎖] 或 SetPrefillValues。 將程式碼取代為所提供的程式碼片段。
- 取代程式碼之後,請從頂端功能表中選取 [取得函式 URL],然後複製 URL。 您會在步驟 2:建立並註冊自訂驗證延伸模組中使用此 URL 作為目標 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。 您會在步驟 2:建立並註冊自訂驗證延伸模組中使用此 URL 作為目標 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:建立和註冊自訂驗證延伸模組
在此步驟中,您會註冊 Microsoft Entra ID 用來呼叫 Azure 函式的自訂驗證延伸模組。 自訂驗證延伸模組包含 REST API 端點的相關資訊、它從 REST API 剖析的屬性收集開始和提交動作,以及如何向 REST API 進行驗證。
以至少應用程式系統管理員和驗證系統管理員的身分登入 Microsoft Entra 系統管理中心。
瀏覽至 [身分識別] > [外部身分識別] > [自訂驗證延伸模組]。
選取 [建立自訂延伸模組]。
在 [基本] 中,選取 AttributeCollectionStart 事件或 AttributeCollectionSubmit 事件,然後選取 [下一步]。 請確定這符合上一個步驟中的設定。
在 [端點設定] 中,填入下列屬性:
- 名稱 - 自訂驗證延伸模組的名稱。 例如,On Attribute Collection 事件。
- 目標 URL - Azure 函式 URL 的
{Function_Url}
。 - 描述 - 自訂驗證延伸模組的描述。
選取 [下一步]。
在 [API 驗證] 中,選取 [建立新的應用程式註冊] 選項,以建立代表您函式應用程式的應用程式註冊。
為應用程式命名,例如 Azure Functions 驗證事件 API。
選取 [下一步]。
選取 [建立],其會建立自訂驗證延伸模組和相關聯的應用程式註冊。
2.2 授與管理員同意
建立自訂驗證延伸模組之後,將應用程式同意授與已註冊的應用程式,其會允許自訂驗證延伸模組向 API 進行驗證。
- 瀏覽至 [身分識別] > [外部身分識別] > [自訂驗證延伸模組 (預覽)]。
- 從清單中選取您的自訂驗證延伸模組。
- 在 [概觀] 索引標籤上,選取 [授與權限] 按鈕,以對已註冊的應用程式授與系統管理員同意。 自訂驗證延伸模組會使用
client_credentials
,使用Receive custom authentication extension HTTP requests
權限向 Azure 函式應用程式進行驗證。 選取 [接受]。
步驟 3:將自訂驗證延伸模組新增至使用者流程
現在您可以將自訂驗證延伸模組與一或多個使用者流程產生關聯。
注意
如果您需要建立使用者流程,請遵循為客戶建立註冊和登入使用者流程中的步驟。
3.1 將自訂驗證延伸模組新增至現有的使用者流程
以至少應用程式系統管理員和驗證系統管理員的身分登入 Microsoft Entra 系統管理中心
如果您有權存取多個租用戶,請使用頂端功能表中的 [設定] 圖示 ,切換至您的外部租用戶。
瀏覽至 [身分識別]> [外部身分識別] > [使用者流程]。
從清單中選取使用者流程。
選取 [自訂驗證延伸模組]。
在 [自訂驗證延伸模組] 頁面上,您可以將自訂驗證延伸模組與使用者流程中的兩個不同的步驟產生關聯:
- 從使用者收集資訊之前會與 OnAttributeCollectionStart 事件相關聯。 選取編輯鉛筆。 只會顯示針對 OnAttributeCollectionStart 事件設定的自訂延伸模組。 選取您為屬性收集開始事件設定的應用程式,然後選擇 [選取]。
- 當使用者提交其資訊時會與 OnAttributeCollectionSubmit 事件相關聯。 只會顯示針對 OnAttributeCollectionSubmit 事件設定的自訂延伸模組。 選取您為屬性收集提交事件設定的應用程式,然後選擇 [選取]。
請確定這兩個屬性收集步驟旁列出的應用程式正確無誤。
選取儲存圖示。
步驟 4:測試應用程式
您可以使用 https://jwt.ms 應用程式來取得權杖並測試自訂驗證延伸模組。 這是 Microsoft 擁有的 Web 應用程式,會顯示已解碼的權杖內容 (權杖內容永遠不會離開您的瀏覽器)。
遵循下列步驟來註冊 jwt.ms Web 應用程式:
4.1 註冊 jwt.ms Web 應用程式
- 以至少應用程式系統管理員的身分登入 Microsoft Entra 系統管理中心。
- 瀏覽至 [身分識別] > [應用程式] > [應用程式註冊]。
- 選取新增註冊。
- 輸入應用程式的 [名稱]。 例如,My Test application。
- 在 [支援的帳戶類型] 底下,選取 [僅在此組織目錄中的帳戶]。
- 在 [重新導向 URI] 的 [選取平台] 下拉式清單中選取 [Web],然後在 URL 文字輸入框中輸入
https://jwt.ms
。 - 選取 [註冊] 以完成應用程式註冊。
4.2 取得應用程式識別碼
在您的應用程式註冊中,於 [概觀] 底下,複製 [應用程式 (用戶端) 識別碼]。 應用程式識別碼在後續步驟中稱為 <client_id>
。 在 Microsoft Graph 中,appId 屬性會參考它。
4.3 啟用隱含流程
jwt.ms 測試應用程式會使用隱含流程。 使用下列步驟,在 [我的測試應用程式] 註冊中啟用隱含流程。
重要
Microsoft 建議您使用最安全的可用驗證流程。 這個程序描述的驗證流程需要在應用程式中具備極高的信任度,且伴隨著其他流程並未面臨的風險。 此方法不應該用於對生產應用程式的使用者進行驗證 (深入了解)。
- 在 [管理] 底下,選取 [驗證]。
- 在 [Implicit grant and hybrid flows] \(隱含授與和混合式流程\) 下,選取 [ID tokens (used for implicit and hybrid flows)] \(識別碼權杖 (用於隱含和混合式流程)\) 核取方塊。
- 選取 [儲存]。
步驟 5:保護您的 Azure 函式
Microsoft Entra 自訂驗證延伸模組會使用伺服器對伺服器流程,以取得在 HTTP Authorization
標頭中傳送至 Azure 函式的存取權杖。 將函式發佈至 Azure 時,特別是在生產環境時,您需要驗證在授權標頭中傳送的權杖。
若要保護您的 Azure 函式,請遵循下列步驟來整合 Microsoft Entra 驗證,以驗證隨 Azure Functions 驗證事件 API 應用程式註冊傳入的權杖。
注意
如果 Azure 函式應用程式裝載於與註冊自訂驗證延伸模組的租用戶不同的 Azure 租用戶中,請跳至 5.1 使用 OpenID Connect 識別提供者步驟。
5.1 將識別提供者新增至 Azure 函式
登入 Azure 入口網站。
瀏覽並選取您先前發佈的函式應用程式。
選取左側功能表中的 [驗證]。
選取 [新增識別提供者]。
選取 Microsoft 作為識別提供者。
選取 [客戶] 作為租用戶類型。
在 [應用程式註冊] 底下,輸入您先前在註冊自訂宣告提供者時建立的 Azure Functions 驗證事件 API 應用程式註冊的
client_id
。針對 [簽發者 URL],輸入下列 URL
https://{domainName}.ciamlogin.com/{tenant_id}/v2.0
,其中{domainName}
是外部租用戶的網域名稱。{tenantId}
是外部租用戶的租用戶識別碼。 您的自訂驗證延伸模組應該在這裡註冊。
在 [未驗證的要求] 底下,選取 [HTTP 401 未授權] 作為識別提供者。
取消選取 [權杖存放區] 選項。
選取 [新增] 以將驗證新增至您的 Azure 函式。
5.2 使用 OpenID Connect 識別提供者
如果您已設定步驟 5:保護 Azure 函式,請略過此步驟。 如果 Azure 函式裝載所在的租用戶和您註冊自訂驗證延伸模組時所在的租用戶不同,請遵循下列步驟來保護您的函式:
登入 Azure 入口網站,然後瀏覽並選取您先前發佈的函式應用程式。
選取左側功能表中的 [驗證]。
選取 [新增識別提供者]。
選取 [OpenID Connect] 作為識別提供者。
提供名稱,例如 Contoso Microsoft Entra ID。
在 [中繼資料項目] 底下,將下列 URL 輸入至 [文件 URL]。 將
{tenantId}
取代為您的 Microsoft Entra 租用戶識別碼。https://login.microsoftonline.com/{tenantId}/v2.0/.well-known/openid-configuration
在 [應用程式註冊] 底下,輸入您先前建立的 Azure Functions 驗證事件 API 應用程式註冊的應用程式識別碼 (用戶端識別碼)。
在 Microsoft Entra 系統管理中心:
- 選取您先前建立的 [Azure Functions 驗證事件 API] 應用程式註冊。
- 選取 [憑證和祕密]>[用戶端密碼]>[新增用戶端密碼]。
- 新增用戶端密碼的描述。
- 選取祕密的到期日,或指定自訂存留期。
- 選取 [新增]。
- 記錄祕密的值,以在用戶端應用程式程式碼中使用。 離開此頁面後,就「不會再次顯示」此祕密值。
回到 Azure 函式,在 [應用程式註冊] 底下,輸入用戶端密碼。
取消選取 [權杖存放區] 選項。
選取 [新增] 以新增 OpenID Connect 識別提供者。
步驟 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>
。 - 將
<client_id>
取代為您新增至使用者流程的應用程式識別碼。
- 將
登入之後,您會在
https://jwt.ms
看到已解碼的權杖。