如何在应用程序中使用启用了连续访问评估的 API

连续访问评估 (CAE) 是一项 Microsoft Entra 功能,它可以根据关键事件策略评估撤销访问令牌,而不管令牌是否过期(具体取决于生存期)。

由于风险和策略是实时评估的,某些资源 API 的令牌生存期可以提高到最多 28 小时。 Microsoft 身份验证库 (MSAL) 会主动刷新这些生存期较长的令牌,从而提高应用程序的复原能力。

不使用 MSAL 的应用程序可以添加对声明质询、声明请求和客户端功能的支持以使用 CAE。

实现注意事项

若要使用 CAE,应用及其访问的资源 API 必须已启用 CAE。 如果资源 API 实现了 CAE,并且你的应用程序声明它可以处理 CAE,那么你的应用将会收到该资源的 CAE 标记。 出于此原因,如果声明了应用已 CAE 就绪,那么你的应用程序必须为所有接受 Microsoft 标识访问令牌的资源 API 处理 CAE 声明质询。

但是,准备代码以支持已启用 CAE 的资源不会限制其使用不支持 CAE 的 API 的能力。 如果应用未正确处理 CAE 响应,它可能会使用技术上有效但因 CAE 而被撤销的令牌重复重试 API 调用。

在应用程序中处理 CAE

首先添加代码来处理由于 CAE 而拒绝调用的资源 API 的响应。 启用 CAE 后,当访问令牌已被撤销或者 API 检测到所使用的 IP 地址发生变化时,API 将返回 401 状态和 WWW-Authenticate 标头。 WWW-Authenticate 标头包含一个声明质询,应用程序可以使用该质询来获取新的访问令牌。

例如:

// Line breaks for legibility only

HTTP 401; Unauthorized

Bearer authorization_uri="https://login.windows.net/common/oauth2/authorize",
  error="insufficient_claims",
  claims="eyJhY2Nlc3NfdG9rZW4iOnsibmJmIjp7ImVzc2VudGlhbCI6dHJ1ZSwgInZhbHVlIjoiMTYwNDEwNjY1MSJ9fX0="

你的应用会检查:

  • 返回 401 状态的 API 调用
  • 是否存在包含以下参数的 WWW-Authenticate 标头:
    • 具有值 insufficient_claimserror 参数
    • claims 参数

满足这些条件时,应用可以使用 MSAL.NET WwwAuthenticateParameters 类提取声明质询并对其进行解码。

if (APIresponse.IsSuccessStatusCode)
{
    // ...
}
else
{
    if (APIresponse.StatusCode == System.Net.HttpStatusCode.Unauthorized
        && APIresponse.Headers.WwwAuthenticate.Any())
    {
        string claimChallenge = WwwAuthenticateParameters.GetClaimChallengeFromResponseHeaders(APIresponse.Headers);

然后,你的应用将使用声明质询获取资源的新访问令牌。

try
{
    authResult = await _clientApp.AcquireTokenSilent(scopes, firstAccount)
        .WithClaims(claimChallenge)
        .ExecuteAsync()
        .ConfigureAwait(false);
}
catch (MsalUiRequiredException)
{
    try
    {
        authResult = await _clientApp.AcquireTokenInteractive(scopes)
            .WithClaims(claimChallenge)
            .WithAccount(firstAccount)
            .ExecuteAsync()
            .ConfigureAwait(false);
    }
    // ...

一旦你的应用程序准备好处理启用了 CAE 的资源返回的声明质询,你就可以告诉 Microsoft 标识你的应用已 CAE 就绪。 若要在 MSAL 应用程序中执行此操作,请使用 "cp1" 的客户端功能构建公共客户端。

_clientApp = PublicClientApplicationBuilder.Create(App.ClientId)
    .WithDefaultRedirectUri()
    .WithAuthority(authority)
    .WithClientCapabilities(new [] {"cp1"})
    .Build();

可通过用户登录,然后用 Azure 门户撤销用户会话,来测试应用程序。 应用下次调用启用 CAE 的 API 时,系统将要求用户重新进行身份验证。

代码示例