You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何修复MS Graph中‘TokenCreatedWithOutdatedPolicies’持续访问评估错误

问题:MS Graph API 运行1天后抛出 TokenCreatedWithOutdatedPolicies 异常

应用基于Java的Microsoft Graph Client开发,通过邮箱查询用户,启动初期正常,运行约1天后抛出如下ODataError异常:

com.microsoft.graph.models.odataerrors.ODataError: Continuous access evaluation resulted in challenge with result: InteractionRequired and code: TokenCreatedWithOutdatedPolicies
    at com.microsoft.graph.models.odataerrors.ODataError.createFromDiscriminatorValue(ODataError.java:36)

使用的依赖

<dependency>
    <groupId>com.microsoft.graph</groupId>
    <artifactId>microsoft-graph</artifactId>
    <version>6.55.0</version>
</dependency>
<dependency>
    <groupId>com.azure</groupId>
    <artifactId>azure-identity</artifactId>
    <version>1.13.0</version>
</dependency>

核心代码实现

配置类

@Configuration
public class MicrosoftGraphConfiguration {
    @Bean
    MicrosoftGraphClient microsoftGraphClient(GraphServiceClient graphServiceClient) {
        return new MicrosoftGraphClient(graphServiceClient);
    }

    @Bean
    GraphServiceClient graphClient(MicrosoftGraphProperties microsoftGraphProperties) {
        ClientSecretCredential credential = new ClientSecretCredentialBuilder()
                .clientId(microsoftGraphProperties.getClientId())
                .clientSecret(microsoftGraphProperties.getClientSecret())
                .tenantId(microsoftGraphProperties.getTenantId())
                .build();
        return new GraphServiceClient(credential);
    }
}

服务类核心方法

private final GraphServiceClient graphClient;

public Optional<User> lookupUserByEmail(String email) {
    try {
        UserCollectionResponse userCollectionResponse = graphClient.users().get(conf -> {
            conf.queryParameters.filter = "mail eq '" + email + "'";
        });
        List<User> users = userCollectionResponse.getValue();
        // 省略后续处理逻辑
        return Optional.of(user);
    } catch (ODataError oDataError) {
        LOGGER.error("Problem while searching user in ms graph.  ", oDataError);
    } catch (Exception e) {
        // 省略其他异常处理
    }
    return Optional.empty();
}

背景与诉求

无法访问Azure后台查看配置和日志,负责策略的团队确认近期无策略变更,怀疑错误提示的TokenCreatedWithOutdatedPolicies并非真实根因。需要:

  1. 排查该错误的底层原因,通过代码调整增加排查可见性
  2. 寻求潜在修复方案(该错误在开发环境难以复现,需运行约1天)

排查方向与代码可见性增强

  • 捕获完整ODataError详情:在ODataError捕获块中,增加打印错误的详细信息,包括oDataError.getError().getDetails()、oDataError.getError().getInnerError(),这些字段通常包含更具体的CAE挑战原因,比如是否涉及特定的条件访问策略。
  • 解析并记录令牌内容:通过JWT解析工具(如JJWT库)解析GraphServiceClient获取的访问令牌,记录令牌的iat(颁发时间)、exp(过期时间),以及CAE相关的声明字段(如acr、cae),确认令牌是否真的存在策略过期问题,或者刷新机制是否异常。
  • 监控令牌缓存行为:GraphServiceClient默认会缓存访问令牌,可以通过添加日志或调试代码,跟踪令牌的缓存命中、刷新时机,确认是否存在缓存的旧令牌未及时刷新的情况。

潜在修复方案

  • 临时禁用CAE评估:在发起Graph请求时添加Prefer: disablecae请求头,绕过CAE的实时策略检查。修改服务类代码:
    UserCollectionResponse userCollectionResponse = graphClient.users().get(conf -> {
        conf.queryParameters.filter = "mail eq '" + email + "'";
        conf.headers.add("Prefer", "disablecae");
    });
    
    注意:这只是临时规避方案,需确认业务场景是否允许禁用CAE。
  • 升级依赖版本:当前使用的microsoft-graph 6.55.0和azure-identity 1.13.0存在一定版本滞后,升级到最新稳定版可能修复CAE令牌刷新相关的已知问题。
  • 添加错误重试逻辑:当捕获到TokenCreatedWithOutdatedPolicies或InteractionRequired错误时,主动触发令牌刷新并重试请求。可以通过GraphServiceClient的令牌刷新机制,或者重新创建Credential实例来获取新令牌。
  • 调整令牌缓存策略:尝试配置ClientSecretCredential的令牌缓存行为,比如缩短缓存过期时间,或者强制每次请求获取新令牌(会影响性能,仅用于测试排查)。

内容的提问来源于stack exchange,提问作者fascynacja

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.11 10:05:03