簡體   English   中英

Azure AD:從其他 .net Core Web API 調用 .net Core Web API

[英]Azure AD: Call .net Core Web API from other .net Core Web API

我有一種情況,我們使用 .net Core Web API 來管理一些“機器”。 公開的 API 之一是模擬此類機器的操作。 機器有不同的版本,每個不同的版本有不同的內部行為但相同的界面。

然后,我們開發了一系列不同的 .net Core Web API 來模擬每個不同版本的機器。

因此,我需要從 API 調用 API,這聽起來很簡單,因為我已經在使用Microsoft Graph這樣做了。

在startup.cs中,我有:

public void ConfigureServices(IServiceCollection services)
{
    // To protect the API with Azure AD
    services
        .AddProtectedWebApi(Configuration);

    // To have ITokenAcquisition when calling the specific simulation API
    services
        .AddMicrosoftIdentityPlatformAuthentication(Configuration)
        .AddMsal(Configuration, new string[] { Configuration["SimulationAPIv411:Scope"] })
        .AddInMemoryTokenCaches();

我正在用 Postman 測試它,並考慮到這個流程:

  1. 我通過 Postman 獲得了一個不記名令牌以訪問通用 API
  2. Postman 在通用 API 中調用 SimulationDispatcherController
  3. SimulationDispatcherController 調用特定的模擬 API
  4. 結果流回郵遞員

我正在經歷的是:

  1. 如果我這樣離開它,在郵遞員中,我會得到一個登錄頁面

    <!-- Copyright (C) Microsoft Corporation. All rights reserved. --> <!DOCTYPE html> <html dir="ltr" class="" lang="en"> <head> <title>Sign in to your account</title> [...]
  2. 如果我刪除.AddMicrosoftIdentityPlatformAuthentication(Configuration)那么我可以訪問 SimulationDispatcherController 但是當它嘗試調用其他 API 時,我收到錯誤消息:

     MSAL.NetCore.4.8.1.0.MsalUiRequiredException: ErrorCode: user_null Microsoft.Identity.Client.MsalUiRequiredException: No account or login hint was passed to the AcquireTokenSilent call. [...]

    我嘗試使用ITokenAcquisition對象獲取令牌,調用GetAccessTokenOnBehalfOfUserAsync(_Scopes); 其中范圍是特定 API 所需的范圍。

您是否有任何建議或指向文檔的鏈接,以更好地解釋如何在受 Azure AD 保護的 API 中配置 MSAL?

編輯:正如答案中所建議的,唯一需要的更改是:

.AddMsal(Configuration, new string[] { Configuration["SimulationAPIv411:Scope"] })

.AddProtectedApiCallsWebApis(Configuration)

似乎其他特定的模擬 API 也受 Azure AD 保護,您可以使用OAuth 2.0 On-Behalf-Of 流,該流程適用於應用程序調用服務/Web API 的場景,而后者又需要調用另一個服務/Web API。

是在帶有 MSAL 2.3 及更高版本的 asp.net core web api 中使用 OBO 流的代碼示例。

如果要從 Azure AD 投射的其他 .net Core Web API 調用 .net Core Web API,請使用OAuth 2.0 On-Behalf-Of 流 詳細步驟如下

  1. 在客戶端應用程序中登錄用戶
  2. 獲取 Web API A 的令牌並調用它。
  3. 然后 Web API 調用另一個下游 Web API B(我使用 Microsoft Graph 進行測試)。

關於如何配置,請參考以下步驟:

注冊 web api 應用程序

  1. 注冊APP
  2. 創建客戶端機密
  3. 配置訪問另一個 web api 的權限 (我使用微軟圖表進行測試)
  4. 配置應用程序以公開 Web API (為 api 添加范圍)

注冊客戶端應用程序

  1. 注冊APP
  2. 創建客戶端機密
  3. 配置訪問 Web API 的權限

為 Web API 應用程序配置已知的客戶端應用程序

  1. 在 Azure 門戶中,導航到您的 Web api 應用注冊並單擊清單部分。

  2. 找到屬性 knownClientApplications 並添加客戶端應用程序的客戶端 ID

配置項目

  1. 將引用Microsoft.Identity.Web添加到您的項目

  2. 在 appsettings.json 中添加以下代碼

{
  "AzureAd": {
    "Instance": "https://login.microsoftonline.com/",
    "TenantId": "<your tenant id>",
    "ClientId": "<app id of Web API A>",
    "ClientSecret": "<app secret of Web API A>"
  },
  1. 在stratup.cs中添加以下代碼
public void ConfigureServices(IServiceCollection services)
{
services.AddProtectedWebApi(Configuration)
                   .AddProtectedApiCallsWebApis(Configuration)
                   .AddInMemoryTokenCaches();
  1. 控制器
[Authorize]
    [ApiController]
    [Route("[controller]")]
    public class WeatherForecastController : ControllerBase
    {
              private readonly ITokenAcquisition _tokenAcquisition;
        private readonly ILogger<WeatherForecastController> _logger;

        public WeatherForecastController(ILogger<WeatherForecastController> logger, ITokenAcquisition tokenAcquisition)
        {
            _logger = logger;
            _tokenAcquisition = tokenAcquisition;
        }



        [HttpGet]
        public async Task<string> Get()
        {

            string[] scopes = { "user.read" }; // the scope of Web API B
            string accessToken = await _tokenAcquisition.GetAccessTokenOnBehalfOfUserAsync(scopes);
            // you use the accessToken to call the Web API B
            GraphServiceClient client = new GraphServiceClient(new DelegateAuthenticationProvider(
                    async (requestMessage) =>
                    {
                        requestMessage.Headers.Authorization =
                            new AuthenticationHeaderValue("Bearer", accessToken);
                    }));

            User user =await client.Me.Request().GetAsync();
            return user.UserPrincipalName;
        }

     }

在郵遞員中測試

  1. 獲取 Web API A 的訪問令牌在此處輸入圖片說明 在此處輸入圖片說明

  2. 調用 Web API A 然后讓 Web API A 調用 Microsoft 圖在此處輸入圖片說明

更多詳細信息,請參閱文檔示例

暫無
暫無

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

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