如何在应用程序中使用启用了连续访问评估的 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 响应,它可能会反复重试 API 调用,使用虽然在技术上有效但由于 CAE 已被吊销的令牌。

在应用程序中处理 CAE

首先添加代码来处理因 CAE 而拒绝调用的资源 API 的响应。 使用 CAE,API 在吊销访问令牌时返回 401 状态和 WWW-Authenticate 标头,或者 API 检测到使用的 IP 地址发生更改。 在标头 WWW-Authenticate 中,包含应用程序可以用来获取新访问令牌的声明质询。

例如:

// Line breaks for legibility only

HTTP 401; Unauthorized

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

你的应用会检查以下项:

  • 返回 401 状态的 API 调用
  • 存在 WWW-Authenticate 标头,其中包含:
    • 具有insufficient_claims值的error参数
    • 一个参数 claims

满足这些条件后,应用可以使用 MSAL.NETWwwAuthenticateParameters 类提取和解码声明质询。

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 时,系统将要求用户重新进行身份验证。

代码示例