共用方式為


可呼叫 Web API 的 Web API:呼叫 API

取得權杖之後,就可以呼叫受保護的 Web API。 您通常從 Web API 的控制器或頁面呼叫下游 API。

控制器程式碼

當您使用 Microsoft.Identity.Web 時,有三種使用案例:

選項 1:使用 SDK 呼叫 Microsoft Graph

在此案例中,您已新增 Microsoft.Identity.Web.GraphServiceClient NuGet 套件,並已依照程式碼設定中的指定在 Startup.cs 中新增 .AddMicrosoftGraph(),您可以直接在控制器或頁面建構函式中插入 GraphServiceClient,並於動作中使用。 下列範例 Razor 頁面顯示已登入使用者的相片。

 [Authorize]
 [AuthorizeForScopes(Scopes = new[] { "user.read" })]
 public class IndexModel : PageModel
 {
     private readonly GraphServiceClient _graphServiceClient;

     public IndexModel(GraphServiceClient graphServiceClient)
     {
         _graphServiceClient = graphServiceClient;
     }

     public async Task OnGet()
     {
         var user = await _graphServiceClient.Me.GetAsync();
         try
         {
             using (var photoStream = await _graphServiceClient.Me.Photo.Content.GetAsync())
             {
                 byte[] photoByte = ((MemoryStream)photoStream).ToArray();
                 ViewData["photo"] = Convert.ToBase64String(photoByte);
             }
             ViewData["name"] = user.DisplayName;
         }
         catch (Exception)
         {
             ViewData["photo"] = null;
         }
     }
 }

選項 2:使用協助程式類別呼叫下游 Web API

在此案例中,您已依照程式碼設定中的指示在 Startup.cs 中新增 .AddDownstreamApi(),您可以直接在控制器或頁面建構函式中插入 IDownstreamWebApi 服務,並於動作中使用:

 [Authorize]
 [AuthorizeForScopes(ScopeKeySection = "TodoList:Scopes")]
 public class TodoListController : Controller
 {
     private IDownstreamWebApi _downstreamWebApi;
     private const string ServiceName = "TodoList";

     public TodoListController(IDownstreamWebApi downstreamWebApi)
     {
         _downstreamWebApi = downstreamWebApi;
     }

     public async Task<ActionResult> Details(int id)
     {
         var value = await _downstreamWebApi.CallApiForUserAsync(
             ServiceName,
             options =>
             {
                 options.RelativePath = $"me";
             });
         return View(value);
     }

CallApiForUserAsync 方法也有強型別泛型覆寫,可讓您直接接收物件。 例如,下列方法已接收 Todo 執行個體,此為 Web API 所傳回 JSON 的強型別表示法。

 // GET: TodoList/Details/5
 public async Task<ActionResult> Details(int id)
 {
     var value = await _downstreamWebApi.CallApiForUserAsync<object, Todo>(
         ServiceName,
         null,
         options =>
         {
             options.HttpMethod = HttpMethod.Get;
             options.RelativePath = $"api/todolist/{id}";
         });
     return View(value);
 }

選項 3:在不使用協助程式類別的情況下呼叫下游 Web API

如果您決定使用 IAuthorizationHeaderProvider 介面取得授權標頭,則以下程式碼會繼續呼叫 Web API 的 Web API:取得應用程式的權杖中所示的範例程式碼。 Web API 控制器的動作中呼叫這段程式碼。 其會呼叫名為 todolist 的下游 API。

取得權杖之後,就當作為持有人權杖來呼叫下游 API。

private async Task CallTodoListService(string accessToken)
{
  // After the token has been returned by Microsoft.Identity.Web, add it to the HTTP authorization header before making the call to access the todolist service.
  authorizationHeader = await authorizationHeaderProvider.GetAuthorizationHeaderForUserAsync(scopes);
  _httpClient.DefaultRequestHeaders["Authorization"] = authorizationHeader;

  // Call the todolist service.
  HttpResponseMessage response = await _httpClient.GetAsync(TodoListBaseAddress + "/api/todolist");
  // ...
}

下一步

  • 若要深入了解,請在下列多部分教學課程系列中建置可登入使用者的 ASP.NET Core Web 應用程式

  • 探索 Microsoft 身分識別平台 Web API 範例