调用 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[] { "https://microsoftgraph.chinacloudapi.cn/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

你想要调用 Microsoft Graph 以外的 Web API。 在这种情况下,你按代码配置中指定的那样将 AddDownstreamApi 添加到 Startup.cs 中,然后可以直接将 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[]{"https://microsoftgraph.chinacloudapi.cn/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 都提供了可简化 API 调用的 SDK,Microsoft Graph 就是这样。

后续步骤

  • 通过在以下多部分教程系列中生成可用户登录的 ASP.NET Core Web 应用来了解详细信息

  • 浏览 Microsoft 标识平台 Web 应用示例