簡體   English   中英

Azure Ad B2C - 在 ASP .net MVC 應用程序中檢索多個 Web API 的多個不記名令牌

[英]Azure Ad B2C - Retrieve multiple bearer token for multiple Web Apis in a ASP .net MVC application

我們有 2 個 Web Api 需要從我們的應用程序中調用。 兩者都在Azure AD B2C中配置。 這是我們需要用來調用其端點的 2 個 scope:

我們目前有兩個應用程序。

  1. SPA 應用程序( https://github.com/Azure-Samples/active-directory-b2c-javascript-msal-singlepageapp
  2. 舊的 Asp .net mvc 應用程序( https://github.com/Azure-Samples/active-directory-b2c-dotnet-webapp-and-webapi

SPA 應用程序(使用 Msal 1 或 Msal 2)能夠檢索不記名令牌,而這兩個應用程序都沒有任何問題。 使用 fiddler,我們可以看到我們的應用程序每次需要承載令牌來調用特定的 web api 時都會調用“/oauth2/v2.0/authorize”端點。 對於每個調用,“范圍”查詢字符串參數根據我需要調用的 api 端點而有所不同。 我還想知道“狀態”查詢字符串參數來自哪里,因為每次調用都不同。

無論如何,SPA 應用程序運行良好。 太好了,問題出在舊的 Asp .net mvc web 應用程序上。 您可以在此 web 站點上找到 Microsoft 提供的示例: https://github.com/Azure-Samples/active-directory-b2c-dotnet-webapp-and-webapi

我的理解是,您不能在“啟動”ZA2F2ED4F8EBC2CBB4C21A29DC40AB61D 中定義的“app.UseOpenIdConnectAuthentication”object 的 scope 屬性中添加我在案例頂部提供的兩個范圍如果你這樣做,那么,B2C 會抱怨和崩潰。

所以,我現在只使用第一個 scope。 在“TasksController”中,“Index”方法顯示了如何為我在這里定義的第一個 scope 檢索不記名令牌。 再一次,它完美地工作。 但是,假設我想為我的第二個 web api 獲取不記名令牌。 在原始的下方,假設我使用此代碼來檢索我的第二個不記名令牌:

            var scope2 = new string[] { "https://merrychristmast.onmicrosoft.com/MySecondFavoriteApp" };
            var claimsPrincipal = ClaimsPrincipal.Current;
            var objIdclaim = claimsPrincipal.FindFirst(ClaimTypes.NameIdentifier);

            string signedInUserID = objIdclaim.Value;

            IConfidentialClientApplication clientapp = ConfidentialClientApplicationBuilder.Create(Globals.ClientId)
                  .WithClientSecret(Globals.ClientSecret)
                  .WithRedirectUri(Globals.RedirectUri)
                  .WithB2CAuthority(Globals.B2CAuthority)
                  .Build();
            new MSALPerUserMemoryTokenCache(clientapp.UserTokenCache, ClaimsPrincipal.Current);

            var accounts2 = await cca.GetAccountsAsync();
            AuthenticationResult result2 = await clientapp.AcquireTokenSilent(scope2, accounts.FirstOrDefault()).ExecuteAsync();

在 result2 變量中,access_token 為 null。 在提琴手中,我可以看到 Msal 正在嘗試使用在 Msal 緩存中找到的刷新令牌來檢索第二個 web api scope。 但是來自服務器的響應包含“MyLovellyApi1”scope 的 scope。 並且 access_token 是 null (不從服務器返回)。 grant_type 使用的是“grant_type=refresh_token”。

在多個 web 站點上,人們說我應該能夠使用刷新令牌來檢索額外的 scope。 Does it mean I can only retrieve additional scope if they are members of the "MyLovellyApi1" scope ex: https://merrychristmast.onmicrosoft.com/MyLovellyApi1\read and https://merrychristmast.onmicrosoft.com/MyLovellyApi1/write ?

如果是這種情況,我想我需要了解使用 MSAL 1.0(隱式流)的 Spa 應用程序如何能夠使用“/authorize”端點為我的每個 web api 檢索多個承載令牌。

誰能解釋我如何才能做到這一點? 我不明白如何從我的 mvc asp.net 應用程序調用“/oauth2/v2.0/authorize”端點,並提供為我的登錄用戶成功請求訪問令牌所需的所有參數。 我每個人都參加了失敗之類的事情。

問候,

SPA 應用程序基於隱式流 您可以請求/authorize端點直接獲取訪問令牌。

ps: state的說明

在此處輸入圖像描述

Asp .net mvc 應用程序基於授權碼流 您需要先請求/authorize端點以獲取授權碼,然后向/token端點發送 POST 請求以獲取訪問令牌。

注意:授權代碼必須是短暫的和一次性的。 如果授權服務器觀察到多次嘗試用授權碼交換訪問令牌,授權服務器應該嘗試撤銷所有基於被泄露的授權碼授予的訪問令牌。

因此,您可以調用以獲取帶有新授權碼的訪問令牌。 嘗試在 Postman 中進行測試將幫助您理解。

暫無
暫無

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

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