簡體   English   中英

向多個后端服務驗證 Azure AD 用戶

[英]Authenticate Azure AD User to multiple backend services

我正在嘗試找到一種授權 web 客戶端的策略,該客戶端對 Azure 中托管的兩個服務進行 HTTP 調用。web 客戶端都是客戶端,兩個 API 服務是 Azure86Functions4 中托管的 Azure6Functions4

對於上述三個應用程序中的每一個,我都在 Azure AD 中設置了一個應用程序注冊,並將兩個 Azure 函數應用程序的范圍暴露給 web 客戶端,以允許客戶端調用它們。 我還為兩個 API 應用程序設置了應用程序角色,並將這些角色分配給用戶。

當 web 客戶端對每個 API 服務進行一次調用時,當前設置運行良好。 但是,我希望 web 客戶端調用服務 A,然后服務 A 使用 web 客戶端的用戶憑據對服務 B 進行 HTTP 調用。 據我所知,當 web 客戶端調用服務 A 時,給 web 客戶端的令牌只有服務 A 的 Scope 和角色,服務 B 沒有任何內容。

我的問題是,允許將用戶憑據傳遞到內部服務的推薦策略是什么? 特別是當原始令牌沒有額外服務的憑據時。

我確實發現了這個問題( App service to app service auth in Azure using Managed Identity ),這與我想要完成的任務非常接近。 標記的答案似乎暗示我自己的應用程序負責為額外服務生成新令牌,但我不確定哪個應用程序對此負責。 是否建議web客戶端單獨請求獲取服務B的令牌,並在HTTP服務A請求中,在調用時將服務B的令牌包含在請求正文中?

不久前我遇到了這樣的場景,我必須從前端為后端 API 的用戶獲取令牌,然后在該 API 調用的后端調用 Azure Management API。

我最終實現的解決方案是啟用令牌獲取以調用下游 API,然后使用現有用戶的令牌在后端 API 中獲取令牌。

我的Startup.cs中的代碼 class:

services
    .AddMicrosoftIdentityWebApiAuthentication(Configuration, "ApiSettings")
    .EnableTokenAcquisitionToCallDownstreamApi()//This does the magic
    .AddInMemoryTokenCaches();

在我的 API controller 中,我不得不使用類似以下的方法注入ITokenAcquisition

private readonly ITokenAcquisition _tokenAcquisition;

public MyController(ITokenAcquisition tokenAcquisition)
{
    _tokenAcquisition = tokenAcquisition;
}

然后使用它來獲取 Azure 管理 API 的令牌:

/// <summary>
/// Gets the access token on behalf of signed-in user to perform Azure
/// Resource Manager (ARM) API.
/// </summary>
/// <returns>
/// Access token.
/// </returns>
private async Task<string> GetAccessTokenForAzureSubscriptionManagementApiRequest()
{
    IEnumerable<string> azureServiceManagementApiScopes = <scopes for Azure Management;
    string accessToken = await _tokenAcquisition.GetAccessTokenForUserAsync(azureServiceManagementApiScopes);
    return accessToken;
}

您可以在此處了解更多信息: https://learn.microsoft.com/en-us/azure/active-directory/develop/scenario-web-app-call-api-app-configuration?tabs=as.netcore

我在閱讀了 Microsoft 的本指南后找到了策略: https://learn.microsoft.com/en-us/azure/active-directory/develop/v2-oauth2-on-behalf-of-flow

一般的想法是讓中間層應用程序(服務 A)向 Azure AD 發出 HTTP 請求,為用戶獲取新令牌。 這個新令牌具有針對服務 B 進行身份驗證的適當范圍和角色,並且包含在對服務 B(針對該用戶)的 HTTP 請求中。

從文檔中,我選擇使用“客戶端機密”路線。 使用以下application/x-www-form-urlencoded內容類型字段向https://login.microsoftonline.com/<tenant>/oauth2/v2.0/token發送請求: 請求字段

我還必須采取 2 個額外步驟來設置我的應用程序。 在 Azure 門戶中,我轉到了服務 A 的應用程序注冊,然后:

  1. 在 API 權限下 -> 授予它對服務 B 的 scope 的權限
  2. 在 Certificates & Secrets 下 -> 添加了一個新的 Client Secret。 這是 HTTP 請求中發送的client_secret字段。

另一個答案有一個這樣的例子,但它是針對 ASP.NET 應用程序,而不是 Azure 函數。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM