Aplikacja internetowa, która wywołuje internetowe interfejsy API: wywoływanie internetowego interfejsu API
Teraz, gdy masz token, możesz wywołać chroniony internetowy interfejs API. Zazwyczaj wywołujesz podrzędny interfejs API z kontrolera lub stron aplikacji internetowej.
Wywoływanie chronionego internetowego interfejsu API
Wywoływanie chronionego internetowego interfejsu API zależy od wybranego języka i platformy:
W przypadku korzystania z aplikacji Microsoft.Identity.Web dostępne są trzy opcje użycia do wywoływania interfejsu API:
- Opcja 1. Wywoływanie programu Microsoft Graph przy użyciu zestawu Microsoft Graph SDK
- Opcja 2. Wywoływanie podrzędnego internetowego interfejsu API za pomocą klasy pomocniczej
- Opcja 3. Wywoływanie podrzędnego internetowego interfejsu API bez klasy pomocniczej
Opcja 1. Wywoływanie programu Microsoft Graph za pomocą zestawu SDK
W tym scenariuszu wywołasz program Microsoft Graph, dodając pakiet NuGet Microsoft.Identity.Web.GraphServiceClient i włączając .AddMicrosoftGraph()
go w Startup.cs zgodnie z konfiguracją kodu. Następnie można bezpośrednio wstrzyknąć element GraphServiceClient
do kontrolera lub konstruktora strony, aby użyć go w akcjach. Poniższa przykładowa strona Razor wyświetla zdjęcie zalogowanego użytkownika.
[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;
}
}
}
Pełny przykład można znaleźć w ASP.NET Core aplikacji internetowej wywołującej program Microsoft Graph.
Opcja 2. Wywoływanie podrzędnego internetowego interfejsu API za pomocą klasy pomocniczej
Chcesz wywołać internetowy interfejs API inny niż Microsoft Graph. W takim przypadku należy dodać AddDownstreamApi
Startup.cs, jak określono w konfiguracji kodu, i można bezpośrednio wstrzyknąć usługę IDownstreamApi
w kontrolerze lub konstruktorze strony i użyć jej w akcjach:
[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);
}
}
Obiekt CallWebApiForUserAsync
ma również silnie typizowane przesłonięcia ogólne, które umożliwiają bezpośrednie odbieranie obiektu. Na przykład następująca metoda odbiera wystąpienie, które jest silnie typizowaną reprezentacją Todo
kodu JSON zwróconego przez internetowy interfejs 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);
}
Pełny przykład można znaleźć w ASP.NET Core aplikacji internetowej wywołującej interfejs API
Opcja 3. Wywoływanie podrzędnego internetowego interfejsu API bez klasy pomocniczej
Podjęto decyzję o ręcznym uzyskaniu tokenu IAuthorizationHeaderProvider
przy użyciu usługi i teraz musisz użyć tokenu. W takim przypadku poniższy kod kontynuuje przykładowy kod pokazany w aplikacji internetowej, która wywołuje internetowe interfejsy API: Uzyskiwanie tokenu dla aplikacji. Kod jest wywoływany w akcjach kontrolerów aplikacji internetowej.
Po uzyskaniu tokenu użyj go jako tokenu elementu nośnego, aby wywołać podrzędny interfejs API, w tym przypadku program 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();
}
Uwaga
Tę samą zasadę można użyć do wywoływania dowolnego internetowego interfejsu API.
Większość internetowych interfejsów API platformy Azure udostępnia zestaw SDK, który upraszcza wywoływanie interfejsu API, tak jak w przypadku programu Microsoft Graph.