如何在应用程序中使用启用了连续访问评估的 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 时,系统将要求用户重新进行身份验证。

代码示例