【Azure Entra ID】AcquireTokenForClient 触发 Entra ID 请求风暴?Shared Cache 才是 Web App 登录的正确方式

简介: Web App调用Azure Entra ID中国区时因未有效缓存令牌,导致请求激增、登录不稳定。根本原因在于MSAL的`ConfidentialClientApplication`未复用且未启用共享缓存。通过单例模式创建应用实例,并配置`WithCacheOptions(CacheOptions.EnableSharedCacheOptions)`,可使令牌在有效期内被复用,避免频繁请求认证端点,显著降低Entra ID负载,提升系统稳定性和性能。

问题描述

Web App 调用 Azure Entra ID 中国区认证端点 login.chinacloudapi.cn 获取访问令牌时,产生了异常巨大的 Entra ID 请求量,最终导致请求失败和整体登录不稳定。

问题发生在使用 MSAL 的 AcquireTokenForClient 获取 Token 场景中,表面现象是“Web App 调用 Entra ID 失败”,实质原因则与令牌缓存未生效密切相关。

 

问题解答

Web App 使用的是 Client Credentials Flow(客户端凭据模式),核心实现依赖 MSAL 的 ConfidentialClientApplicationAcquireTokenForClient 方法。

 

优化后的关键代码如下(原文代码):

    var app = ConfidentialClientApplicationBuilder
        .Create(clientId)
        .WithClientSecret(clientSecret)
        .WithAuthority(new Uri(authority))
        .WithLegacyCacheCompatibility(false)
        .WithCacheOptions(CacheOptions.EnableSharedCacheOptions)
        .Build();

以及在获取访问令牌时:

await app.AcquireTokenForClient(scopes).ExecuteAsync();

围绕上述代码,AcquireTokenForClient 获取 Token 的完整流程可以拆解为以下几个关键点:

一:ConfidentialClientApplication 是 Token 缓存的承载者

ConfidentialClientApplication 表示 Web App 自身在 Azure Entra ID中的“应用身份”,它不仅负责向 Entra ID发起认证请求,同时内部维护了 MSAL 的访问令牌缓存。如果该对象被频繁创建或生命周期过短,缓存将无法复用,直接导致每次获取 token 都访问 Entra ID。

 

二:WithCacheOptions(CacheOptions.EnableSharedCacheOptions) 的核心作用


.WithCacheOptions(CacheOptions.EnableSharedCacheOptions)

这行代码的意义在于:

  • 显式启用 Shared Token Cache
  • 允许同一应用实例在多个 token 请求之间共享并复用已获取的 access token
  • 在 token 有效期内,MSAL 会优先从缓存返回 token,而不是访问 Entra ID

缺少该配置,或未正确复用 app 对象时,即使使用了 MSAL,也相当于每次 AcquireTokenForClient 都是一次全新的登录请求。

 

三:AcquireTokenForClient 的真实执行逻辑

当调用以下代码时:

await app.AcquireTokenForClient(scopes).ExecuteAsync();

MSAL 实际执行顺序为:

1:在本地缓存中查找匹配 scopes 的 access token

2:如果 token 存在且未过期 → 直接返回(不调用 AAD (Entra ID))

3:如果不存在或已过期 → 才向 login.chinacloudapi.cn 发起一次新的 token 请求

4:将新 token 写入缓存,供后续请求复用

 

四:最后,正确的方式是

  • 应用级别(如 Startup / Singleton)创建一次 ConfidentialClientApplication
  • 启用 .WithCacheOptions(CacheOptions.EnableSharedCacheOptions)
  • 所有业务代码统一调用 AcquireTokenForClient 获取 token


通过该方式,可以显著降低对 Azure Entra ID的请求压力,避免登录风暴,并提升 Web App 的稳定性。

 

参考资料

MSAL Token Cache 说明 :https://learn.microsoft.com/en-us/entra/identity-platform/msal-acquire-cache-tokens#acquiring-tokens

 


当在复杂的环境中面临问题,格物之道需:浊而静之徐清,安以动之徐生。 云中,恰是如此!

相关文章
|
Linux 开发工具 C++
【vcpkg】像Python一样方便的import 自己的c++库
使用此种方式可无需设置 CMAKE_TOOLCHAIN_FILE 即可使用 vcpkg,且更容易完成配置工作。
1715 0
|
4月前
|
人工智能 自然语言处理 算法
2025AI数字人企业名单列表新发布及全栈技术指南
数字人产业正迎来技术与应用的双重突破,全栈自研与生态协同并行发展。从虚拟主播到工业元宇宙,十强企业各展所长:像衍科技以产学研一体化构建全链条技术壁垒,阿里、京东布局电商与服务,华为、腾讯深耕工业与社交场景。数字人已跨越“仿真”阶段,迈向情感化、智能化、资产化新纪元,广泛应用于政务、医疗、教育等领域,实现降本增效与体验升级。未来,“安全可控+轻量部署+类人交互”将推动数字人成为虚实共生的核心生产力。
|
4月前
|
数据采集 人工智能 自然语言处理
AI导航网站全景解析:从工具聚合到技术赋能
2025年AI工具爆发,信息差仍存。本文盘点国内主流AI导航平台,如AI工具集、AI产品库、非猪AI等,解析其背后的数据采集、智能分类、个性化推荐技术,并展望空间智能、多模态交互与数字孪生驱动的未来演进方向,助力用户高效选型、开发者把握趋势。
441 7
|
4月前
|
缓存 Linux
Linux 麒麟系统安装 libstdc++ rpm 包步骤
下载指定rpm文件后,通过终端进入目录,使用`sudo yum install`命令安装libstdc++库,自动解决依赖。安装后通过`rpm -q`或`ldconfig -p`验证是否成功。如遇问题可卸载旧版或更新缓存。
|
4月前
|
Kubernetes 网络协议 容器
【k8s-1.34.2安装部署】七.coredns-v1.13.1安装
本章介绍如何安装并验证coredns-v1.13.1。下载coredns.yaml.base文件,替换镜像地址、DNS域、内存限制及服务IP,应用配置后通过svc和pod验证CoreDNS解析功能是否正常。
453 11
|
4月前
|
人工智能 算法 PyTorch
算力不一定越猛越好:聊聊 AI 设备的低功耗算力优化这条现实之路
算力不一定越猛越好:聊聊 AI 设备的低功耗算力优化这条现实之路
239 10
|
4月前
|
存储 运维 NoSQL
架构稳、低运维、按需付- Dify x 阿里云 Tablestore 解锁百亿级索引
今天,Dify 正式适配阿里云 Tablestore 向量索引能力,并依托 阿里云计算巢 提供一键部署体验。企业无需重构现有架构,即可享受极简运维、按需付费的灵活成本,以及原生支持百亿级向量检索的扩展能力,从容应对AI应用的结构化数据增长。
241 3
架构稳、低运维、按需付- Dify x 阿里云 Tablestore 解锁百亿级索引
|
4月前
|
网络协议 Go 开发者
Go语言错误处理之错误类型判断(从零掌握Go中error的类型识别与自定义)
本文详解Go语言错误处理中的类型判断技巧,介绍如何使用`errors.Is()`、`errors.As()`和类型断言区分不同错误,结合实例讲解自定义错误的最佳实践,帮助开发者构建更健壮、可维护的应用程序。
|
4月前
|
传感器 算法 机器人
医疗导诊机器人关键技术深度解析
智慧医院建设推动导诊机器人迈向智能化,集成医疗大模型、知识图谱、多传感器融合、情感计算等核心技术,实现精准分诊、厘米级导航、跨楼层协同与人性化交互,正从“迎宾员”转型为医疗流程中枢,助力医疗服务高效化、人性化、安全化发展。
|
4月前
|
人工智能 运维 安全
2025年主流接口测试工具对比分析与最佳实践指南
文章围绕2025年接口测试工具展开,介绍其在自动化、云化与AI赋能方向的演进。对比SaaS化平台、本地化部署方案及AI驱动型工具的特点、优势与局限,分析行业痛点及解决方案。还给出构建一体化链路的最佳实践,以及工具选择建议,助力企业提升测试效率与质量。