Web API を呼び出す Web アプリ: Web API を呼び出す

トークンを取得すると、保護された Web API を呼び出せます。 通常、Web アプリのコントローラーまたはページからダウンストリーム API を呼び出します。

保護された Web API を呼び出す

保護された Web API の呼び出しは、選択した言語とフレームワークによって異なります。

Microsoft.Identity.Web を使用する場合、API を呼び出すための使用オプションが 3 つあります。

オプション 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 を呼び出す必要があります。 この場合、コード構成に関するページで説明されているように、AddDownstreamApiStartup.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 が用意されています。

次のステップ