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


Создание веб-API, который вызывает интерфейсы веб-API. Вызов API

При наличии маркера можно вызвать защищенный веб-API. Обычно подчиненные интерфейсы API вызываются из контроллера или со страниц веб-API.

Код контроллера

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

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

В этом сценарии вы добавили пакет 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;
         }
     }
 }

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

В этом сценарии вы добавили .AddDownstreamApi() в Startup.cs, как указано в разделе Конфигурация кода, и можете напрямую внедрить службу 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 — строго типизированное представление JSON, возвращенное интерфейсом веб-API.

 // 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. Вызов подчиненного веб-API без вспомогательного класса

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

Получив маркер, используйте его как маркер носителя при вызове подчиненного 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, которое входит в систему пользователей в следующей серии учебников с несколькими частью

  • Ознакомьтесь с примерами веб-API платформа удостоверений Майкрософт