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

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

  • 使用令牌缓存获取 Web API 的令牌。 若要获取此令牌,请调用 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。 若要获取令牌以调用下游 API,可以通过控制器构造函数(如果使用 Blazor,则为页面构造函数)中的依赖项注入来注入 ITokenAcquisition 服务,并在控制器操作中使用该服务,从而为用户 (GetAccessTokenForUserAsync) 或守护程序方案中的应用程序本身 (GetAccessTokenForAppAsync) 获取令牌。

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

[Authorize]
public class HomeController : Controller
{
 readonly ITokenAcquisition tokenAcquisition;

 public HomeController(ITokenAcquisition tokenAcquisition)
 {
  this.tokenAcquisition = tokenAcquisition;
 }

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

}

ITokenAcquisition 服务是由 ASP.NET 通过使用依赖项注入来注入的。

下面是 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 tokenAcquisition.GetAccessTokenForUserAsync(scopes);

 // Use the access token to call a protected web API.
 HttpClient client = new HttpClient();
 client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", 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