共用方式為


呼叫 Web API 的 Web 應用程式:呼叫 Web API

現在您已有權杖,您可以呼叫受保護的 Web API。 您通常從 Web 應用程式的控制器或頁面呼叫下游 API。

呼叫受保護的 Web API

如何呼叫受保護的 Web API 取決於您選擇的語言和架構:

使用 Microsoft.Identity.Web 時,呼叫 API 有三種使用方式選項:

選項 1:使用 SDK 呼叫 Microsoft Graph

在此案例中,您可以透過新增 Microsoft.Identity.Web.GraphServiceClient NuGet 套件,並依照程式碼設定中的指定,在 Startup.cs 中包含 .AddMicrosoftGraph() 來呼叫 Microsoft Graph。 然後,您可以直接將 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;
  }
 }
}

如需完整範例,請參閱呼叫 Microsoft Graph 的 ASP.NET Core Web 應用程式

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

您想要呼叫 Web API 而不是 Microsoft Graph。 在此情況下,您已依照程式碼設定中的指定在 Startup.cs 中新增 AddDownstreamApi,您可以直接在控制器或頁面建構函式中插入 IDownstreamApi 服務,並於動作中使用:

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

  public TodoListController(IDownstreamApi downstreamApi)
  {
    _downstreamApi = downstreamApi;
  }

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

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

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

如需完整範例,請參閱呼叫 API 的 ASP.NET Core Web 應用程式

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

您已決定使用 IAuthorizationHeaderProvider 服務手動取得權杖,而現在需要使用此權杖。 在此情況下,下列程式碼延續呼叫 Web API 的 Web 應用程式:取得應用程式的權杖中顯示的範例程式碼。 Web 應用程式控制器的動作中呼叫這段程式碼。

取得權杖之後,就當作為持有人權杖來呼叫下游 API,在此案例中為 Microsoft Graph。

public async Task<IActionResult> Profile()
{
  // Acquire the access token.
  string[] scopes = new string[]{"user.read"};
  string authorizationHeader = await IAuthorizationHeaderProvider.GetAuthorizationHeaderForUserAsync(scopes);

  // Use the access token to call a protected web API.
  HttpClient httpClient = new HttpClient();
  client.DefaultRequestHeaders.Add("Authorization", authorizationHeader);

  var response = await httpClient.GetAsync($"{webOptions.GraphApiUrl}/beta/me");

  if (response.StatusCode == HttpStatusCode.OK)
  {
    var content = await response.Content.ReadAsStringAsync();

    dynamic me = JsonConvert.DeserializeObject(content);
    ViewData["Me"] = me;
  }

  return View();
}

注意

您可以使用相同的準則來呼叫任何 Web API。

大部分 Azure Web API 都提供 SDK 來簡化呼叫 API,Microsoft Graph 就是如此。

下一步