调用 Web API 的 Web 应用:获取应用的令牌

你已构建了客户端应用程序对象。 现在,你使用它获取令牌来调用 Web API。 在 ASP.NET 或 ASP.NET Core 中,调用 Web API 是在控制器中完成的。

  • 使用令牌缓存获取 Web API 的令牌。 若要获取此令牌,请调用 Microsoft 身份验证库 (MSAL) AcquireTokenSilent 方法(或 Microsoft.Identity.Web 中的等效方法)。
  • 调用受保护的 API,将访问令牌作为参数传递给它。

Microsoft.Identity.Web 添加了扩展方法,这些方法为调用 Microsoft Graph 或下游 Web API 提供便利服务。 若要详细了解这些方法,请参阅调用 Web API 的 Web 应用:调用 API。 使用这些帮助程序方法,你无需手动获取令牌。

但是,如果你确实想要手动获取令牌,可以通过以下代码以示例方式了解如何使用 Microsoft.Identity.Web 在主控制器中执行此操作。 它使用 REST API(而不是 Microsoft Graph SDK)调用 Microsoft Graph。 通常,无需获取令牌,而是需要生成添加到请求的授权标头。 若要获取授权标头,请通过依赖项注入将 IAuthorizationHeaderProvider 服务注入的构造函数控制器(如果使用 Blazor,则注入页面构造函数),并在控制器操作中使用它。 此接口提供了方法来生成包含协议(持有者、Pop 等)和一个令牌的字符串。 若要获取授权标头来代表用户调用 API,请使用 (CreateAuthorizationHeaderForUserAsync)。 若要获取授权标头来代表应用程序本身调用下游 API,请在守护程序方案中使用 (CreateAuthorizationHeaderForAppAsync)。

控制器方法受 [Authorize] 属性的保护,该属性确保只有经过身份验证的用户可使用 Web 应用。

[Authorize]
public class HomeController : Controller
{
 readonly IAuthorizationHeaderProvider authorizationHeaderProvider;

 public HomeController(IAuthorizationHeaderProvider authorizationHeaderProvider)
 {
  this.authorizationHeaderProvider = authorizationHeaderProvider;
 }

 // Code for the controller actions (see code below)

}

ASP.NET Core 通过依赖项注入提供 IAuthorizationHeaderProvider

下面是 HomeController 的操作的简化代码,该操作获取令牌来调用 Microsoft Graph:

[AuthorizeForScopes(Scopes = new[] { "https://microsoftgraph.chinacloudapi.cn/user.read" })]
public async Task<IActionResult> Profile()
{
 // Acquire the access token.
 string[] scopes = new string[]{"https://microsoftgraph.chinacloudapi.cn/user.read"};
 string accessToken = await authorizationHeaderProvider.CreateAuthorizationHeaderForUserAsync(scopes);

 // Use the access token to call a protected web API.
 HttpClient client = new HttpClient();
 client.DefaultRequestHeaders.Add("Authorization", accessToken);
 string json = await client.GetStringAsync(url);
}

若要更好地了解此方案所需的代码,请参阅 ms-identity-aspnetcore-webapp-tutorial 教程的阶段 2(2-1-Web 应用调用 Microsoft Graph)步骤。

在控制器操作顶部(如果你使用 Razor 模板,则为 Razor 页面顶部)的 AuthorizeForScopes 属性由 Microsoft.Identity.Web 提供。 它确保在需要时以增量方式要求用户提供许可。

还有其他复杂的变化形式,例如:

  • 调用多个 API。
  • 处理增量许可和条件访问。

3-WebApp-multi-APIs 教程的第 3 章中涵盖了这些高级步骤。

后续步骤

转到此方案中的下一篇文章:调用 Web API