Создание веб-API, который вызывает интерфейсы веб-API. Вызов API
При наличии маркера можно вызвать защищенный веб-API. Обычно подчиненные интерфейсы API вызываются из контроллера или со страниц веб-API.
Код контроллера
При использовании Microsoft.Identity.Web есть три варианта вызова API:
- Вариант 1. Вызов Microsoft Graph с помощью пакета SDK
- Вариант 2. Вызов подчиненного веб-API через вспомогательный класс
- Вариант 3. Вызов подчиненного веб-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");
// ...
}