使用 Microsoft Entra ID 驗證和授權應用程式,以存取 Azure 服務匯流排實體
Azure 服務匯流排支援使用 Microsoft Entra ID 來授權服務匯流排實體 (佇列、主題、訂閱或篩選) 的要求。 透過 Microsoft Entra ID,您可以使用 Azure 角色型存取控制 (Azure RBAC),將權限授與安全性主體 (可能是使用者、群組、應用程式服務主體或適用於 Azure 資源的受控識別)。 使用 Microsoft Entra ID 搭配 Azure 服務匯流排的主要優點是您不再需要將認證儲存在程式碼中。 您可以改為從 Microsoft 身分識別平台要求 OAuth 2.0 存取權杖。 如果驗證成功,Microsoft Entra ID 會將存取權杖傳回給應用程式,然後應用程式就可以使用存取權杖來授權存取服務匯流排資源的要求。
重要
您可以停用服務匯流排命名空間的本機或 SAS 金鑰驗證,只允許透過 Microsoft Entra 驗證。 如需逐步指示,請參閱停用本機驗證。
概觀
當安全性主體 (使用者、群組或應用程式) 嘗試存取服務匯流排實體時,要求必須獲得授權。 使用 Microsoft Entra ID 時,存取資源的流程分為兩個步驟。
- 首先,安全性主體的身分識別需通過驗證,並傳回 OAuth 2.0 權杖。 要求權杖的資源名稱為
https://servicebus.azure.net
。 - 接下來,權杖會當做要求的一部分傳遞給服務匯流排服務,以授權指定資源的存取權。
驗證步驟要求應用程式要求在執行階段包含 OAuth 2.0 存取權杖。 如果應用程式在 Azure 實體 (例如 Azure VM、虛擬機器擴展集或 Azure Function 應用程式) 內執行,則可使用受控識別來存取資源。 若要了解如何驗證受控識別對服務匯流排服務所提出的要求,請參閱使用適用於 Azure 資源的 Microsoft Entra ID 和受控識別來驗證 Azure 服務匯流排資源的存取權。
授權步驟需要將一或多個 Azure 角色指派給安全性主體。 Azure 服務匯流排能提供其中帶有服務匯流排資源權限集的 Azure 角色。 指派給安全性主體的角色,會決定該主體在服務匯流排資源上所擁有的權限。 若要深入瞭解如何將 Azure 角色指派給 Azure 服務匯流排,請參閱適用於 Azure 服務匯流排的 Azure 內建角色。
對服務匯流排提出要求的原生應用程式和 Web 應用程式,也可以使用 Microsoft Entra ID 來進行授權。 本文說明如何要求存取權杖,並用它來授權服務匯流排資源的要求。
Azure 服務匯流排的 Azure 內建角色
Microsoft Entra 會透過 Azure RBAC 來授與存取受保護資源的權限。 Azure 服務匯流排會定義一組 Azure 內建角色,這組角色包含一組用來存取服務匯流排資料的常用權限,而且您也可以定義自訂角色來存取資料。
將 Azure 角色指派給 Microsoft Entra 安全性主體時,Azure 會將那些資源的存取權授與該安全性主體。 存取範圍可以限定為訂用帳戶層級、資源群組、服務匯流排命名空間或實體 (佇列、主題或訂用帳戶)。 Microsoft Entra 安全性主體可以是使用者、群組或應用程式服務主體,或是適用於 Azure 資源的受控識別。
對於 Azure 服務匯流排來說,透過 Azure 入口網站和 Azure 資源管理 API 來的管理命名空間和所有相關資源的作業,皆已使用 Azure RBAC 模型來加以保護。 Azure 提供下列內建角色,以授權存取服務匯流排命名空間:
- Azure 服務匯流排資料擁有者:使用此角色來授與服務匯流排資源的完整存取權。
- Azure 服務匯流排資料傳送者:使用此角色來授與服務匯流排命名空間及其實體的資料傳送權限。
- Azure 服務匯流排資料接收者:使用此角色來授與服務匯流排命名空間及其實體的資料接收權限。
資源範圍
將 Azure 角色指派給安全性主體之前,請先決定安全性主體應該具備的存取範圍。 最佳做法指出,最好只授與最窄的可能範圍。
下列清單說明您可以將服務匯流排資源的存取範圍設定在什麼層級 (從最小的範圍開始):
佇列、主題或訂閱:角色指派適用於特定的服務匯流排實體。 目前,Azure 入口網站不支援將使用者/群組/受控識別指派給主題訂用帳戶層級的服務匯流排 Azure 角色。
服務匯流排命名空間:角色指派的範圍為該命名空間下服務匯流排的整個拓撲,以及相關聯的佇列或主題訂用帳戶。
資源群組:角色指派會套用至資源群組下的所有服務匯流排資源。
Azure 訂用帳戶:角色指派會套用至訂用帳戶中所有資源群組的所有服務匯流排資源。
注意
請記住,Azure 角色指派最多可能需要五分鐘的時間傳播。
如需內建角色定義方式的詳細資訊,請參閱了解角色定義。 如需建立 Azure 自訂角色的相關資訊,請參閱 Azure 自訂角色。
從應用程式進行驗證
使用 Microsoft Entra ID 搭配服務匯流排的主要優點是您的認證不再需要儲存在程式碼中。 您可以改為向 Microsoft 身分識別平台要求 OAuth 2.0 存取權杖。 Microsoft Entra 可驗證執行應用程式的安全性主體 (使用者、群組、應用程式服務主體,或是適用於 Azure 資源的受控識別)。 如果驗證成功,Microsoft Entra ID 會將存取權杖傳回給應用程式,然後應用程式就可以使用存取權杖來授權存取 Azure 服務匯流排的要求。
下列各節說明如何設定原生應用程式或 Web 應用程式,以使用 Microsoft 身分識別平台 2.0 進行驗證。 如需 Microsoft 身分識別平台 2.0 的詳細資訊,請參閱 Microsoft 身分識別平台 (v2.0) 概觀。
如需 OAuth 2.0 程式碼授與流程的概觀,請參閱使用 OAuth 2.0 程式碼授與流程,授權存取 Microsoft Entra Web 應用程式。
使用 Microsoft Entra 租用戶註冊您的應用程式
使用 Microsoft Entra ID 授權服務匯流排實體的第一個步驟是,從 Azure 入口網站使用 Microsoft Entra 租用戶註冊您的用戶端應用程式。 當您註冊用戶端應用程式時,會向 AD 提供應用程式的相關資訊。 Microsoft Entra ID 接著會提供您可以用來將應用程式與 Microsoft Entra 執行階段產生關聯的用戶端識別碼 (也稱為應用程式識別碼)。 若要深入了解用戶端識別碼,請參閱 Microsoft Entra ID 中的應用程式和服務主體物件。
若要使用 Microsoft Entra ID 註冊您的應用程式,請遵循快速入門:向 Microsoft 身分識別平台註冊應用程式中所示的步驟。
注意
如果您將應用程式註冊為原生應用程式,就能為重新導向 URI 指定任何有效的 URI。 針對原生應用程式,此值不需是實際的 URL。 針對 Web 應用程式,重新導向 URI 必須是有效的 URI,因為其會指定要提供權杖的 URL。
註冊您的應用程式之後,您會在 [設定] 下看到 [應用程式 (用戶端) 識別碼] 和 [目錄 (租用戶) 識別碼]:
重要
記下 TenantId 和 ApplicationId。 您將需要這些值才能執行應用程式。
如需有關使用 Microsoft Entra ID 註冊應用程式的詳細資訊,請參閱整合應用程式與 Microsoft Entra ID。
建立用戶端密碼
應用程式需要用戶端密碼,才能在要求權杖時證明其身分識別。 若要新增用戶端秘密,請遵循下列步驟。
如果您尚未在該頁面上,請在 Azure 入口網站中流覽至您的應用程式註冊頁面。
選取左側選單上的 [憑證與祕密]。
在 [用戶端秘密] 下,選取 [新增用戶端秘密] 以建立新的密碼。
提供秘密的描述,然後選擇所需的到期間隔,接著選取 [新增]。
請立即將新祕密的值複製到安全的位置。 填滿值只會向您顯示一次。
服務匯流排 API 的存取權限
若您的應用程式是一個主控台應用程式,您必須註冊原生應用程式,並將 Microsoft.ServiceBus 的 API 權限新增至所需的權限集合。 原生應用程式也需要 Microsoft Entra ID 中的 redirect-uri 作為識別碼;此 URI 不必是網路目的地。 在此範例中使用 https://servicebus.microsoft.com
,因為程式碼範例已使用該 URI。
使用 Azure 入口網站指派 Azure 角色
在所需範圍內 (實體、服務匯流排命名空間、資源群組、Azure 訂用帳戶),將其中一個服務匯流排角色指派給應用程式的服務主體。 如需詳細步驟,請參閱使用 Azure 入口網站指派 Azure 角色。
定義角色及其範圍之後,您可以使用 GitHub 上的範例來測試此行為。
驗證服務匯流排用戶端
註冊應用程式並授與它 Azure 服務匯流排中傳送/接收資料的權限之後,您就可以使用用戶端密碼認證來驗證用戶端,讓您對 Azure 服務匯流排提出要求。
如需支援取得權杖的案例清單,請參閱適用於 .NET 的 Microsoft 驗證程式庫 (MSAL) GitHub 存放庫的案例一節。
藉由使用最新的 Azure.Messaging.ServiceBus 程式庫,您可以使用 Azure.Identity 程式庫中定義的 ClientSecretCredential 來驗證 ServiceBusClient。
TokenCredential credential = new ClientSecretCredential("<tenant_id>", "<client_id>", "<client_secret>");
var client = new ServiceBusClient("<fully_qualified_namespace>", credential);
如果您使用的是較舊的 .NET 套件,請參閱 azure-service-bus 範例存放庫中的 RoleBasedAccessControl 範例。
下一步
- 若要深入了解 Azure RBAC,請參閱什麼是 Azure 角色型存取控制 (Azure RBAC)?
- 若要了解如何使用 Azure PowerShell、Azure CLI 或 REST API 來指派和管理 Azure 角色指派,請參閱下列文章:
若要深入了解服務匯流排訊息,請參閱下列主題。