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