Поделиться через


Веб-приложение, вызывающее веб-API. Вызов веб-API

Теперь у вас есть токен и вы можете вызвать защищенный веб-API. Обычно нижестоящий API вызывается из контроллера или со страниц вашего веб-приложения.

Вызов защищенного веб-API

Вызов защищенного веб-API зависит от выбранного вами языка и платформы.

При использовании Microsoft.Identity.Web есть три варианта вызова API:

Вариант 1. Вызов Microsoft Graph с помощью пакета SDK

В этом сценарии необходимо вызвать Microsoft Graph, добавив пакет NuGet Microsoft.Identity.Web.GraphServiceClient и в том числе .AddMicrosoftGraph() в Startup.cs, как указано в конфигурации кода. Затем вы можете напрямую внедрить его 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;
  }
 }
}

Полный пример см. в разделе ASP.NET Веб-приложение Core, которое вызывает Microsoft Graph.

Вариант 2. Вызов подчиненного веб-API через вспомогательный класс

Вы хотите вызвать веб-API, а не Microsoft Graph. В этом случае вы добавляете 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 — строго типизированное представление JSON, возвращенное интерфейсом веб-API.

    // 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);
    }

Полный пример см. в веб-приложении ASP.NET Core, которое вызывает API.

Вариант 3. Вызов подчиненного веб-API без вспомогательного класса

Вы решили получить маркер вручную с помощью службы IAuthorizationHeaderProvider, а теперь собираетесь использовать этот маркер. В этом случае следующий код выступает продолжением кода из статьи Веб-приложение, вызывающее веб-API: получение маркера для приложения. Код вызывается в действиях контроллеров веб-приложения.

Получив маркер, используйте его как маркер носителя при вызове нижестоящего 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();
}

Примечание.

Этот же принцип соблюдается при вызове любого веб-API.

В большинстве веб-API Azure есть пакет SDK, упрощающий вызов API, как это сделано для Microsoft Graph.

Следующие шаги

  • Узнайте больше, создав веб-приложение ASP.NET Core, которое входит в систему пользователей в следующей серии учебников с несколькими частью

  • Изучение примеров веб-приложения платформа удостоверений Майкрософт