次の方法で共有


Web API を呼び出す Web API: API を呼び出す

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

コントローラー コード

Microsoft.Identity.Web を使用する場合、3 つの使用シナリオがあります。

オプション 1: SDK を使用して Microsoft Graph を呼び出す

このシナリオでは Microsoft.Identity.Web.GraphServiceClient NuGet パッケージを追加し、コード構成で説明されているように Startup.cs.AddMicrosoftGraph() を追加しました。また、コントローラーかページ コンストラクターに 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:ヘルパー クラスを使用してダウンストリーム Web API を呼び出す

このシナリオでは、コード構成に関するページで説明されているように、Startup.cs.AddDownstreamApi() を追加し、コントローラーまたはページ コンストラクターに 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 インスタンスを受け取ります。これは、Web API から返された JSON の厳密に型指定された表現です。

 // 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:ヘルパー クラスを使用せずにダウンストリーム Web API を呼び出す

IAuthorizationHeaderProvider インターフェイスを使用して承認ヘッダーを取得することにした場合、次のコードは、「Web API を呼び出す Web API: アプリのトークンを取得する」に示されているコード例を続行します。 このコードは、API コントローラーのアクションで呼び出されます。 todolist という名前のダウンストリーム API を呼び出します。

トークンを取得した後、ダウンストリーム 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");
  // ...
}

次のステップ