Web API を呼び出す Web アプリ: Web API を呼び出す
トークンを取得すると、保護された Web API を呼び出せます。 通常、Web アプリのコントローラーまたはページからダウンストリーム API を呼び出します。
保護された Web API を呼び出す
保護された Web API の呼び出しは、選択した言語とフレームワークによって異なります。
Microsoft.Identity.Web を使用する場合、API を呼び出すための使用オプションが 3 つあります。
- オプション 1: Microsoft Graph SDK を使用して Microsoft Graph を呼び出す
- オプション 2: ヘルパー クラスを使用してダウンストリーム Web API を呼び出す
- オプション 3:ヘルパー クラスを使用せずにダウンストリーム Web API を呼び出す
オプション 1: SDK を使用して Microsoft Graph を呼び出す
このシナリオでは、Code 構成に関するページで説明されているように、Microsoft.Identity.Web.GraphServiceClient NuGet パッケージを追加し、.AddMicrosoftGraph()
を Startup.cs にを含めることで、Microsoft Graph を呼び出します。 その後、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;
}
}
}
詳細なサンプルについては、Microsoft Graph を呼び出す ASP.NET Core Web アプリに関するページを参照してください。
オプション 2:ヘルパー クラスを使用してダウンストリーム Web API を呼び出す
Microsoft Graph 以外の Web API を呼び出す必要があります。 この場合、コード構成に関するページで説明されているように、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
インスタンスを受け取ります。これは、Web API から返された JSON の厳密に型指定された表現です。
// 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);
}
詳細なサンプルについては、API を呼び出す ASP.NET Core Web アプリを参照してください
オプション 3:ヘルパー クラスを使用せずにダウンストリーム Web API を呼び出す
IAuthorizationHeaderProvider
サービスを使用して手動でトークンを取得することにしました。そのため、トークンを使用する必要があります。 この場合、次のコードは、「Web API を呼び出す Web アプリ: アプリのトークンを取得する」で示されているコード例の続きです。 このコードは、Web アプリ コントローラーのアクションで呼び出されます。
トークンを取得したら、それをベアラー トークンとして使用してダウンストリーム 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();
}
注意
同じ原則を使用するとどの web API も呼び出すことができます。
ほとんどの Azure Web API には、Microsoft Graph の場合のように、API の呼び出しを簡略化する SDK が用意されています。
次のステップ
次のマルチパートのチュートリアル シリーズで、ユーザーをサインインさせる ASP.NET Core Web アプリを構築して、さらに詳しく学習する
Microsoft ID プラットフォームの Web アプリのサンプルを調べる