如何将Azure AD PublicClientApplication令牌持久化存储到磁盘
根本原因
默认通过PublicClientApplicationBuilder构建的IPublicClientApplication实例,令牌缓存是纯内存级的,进程退出后内存被系统回收,缓存的账户、令牌数据会全部清空,这和Azure侧配置无关,不需要在Azure门户做任何特殊调整。
实现方法
要实现跨启动的缓存持久化,只需要给客户端实例的用户令牌缓存注册序列化回调,把缓存数据写入持久化存储即可,你原有业务逻辑不需要改动。
本地磁盘持久化(推荐命令行/本地短生命周期程序使用)
直接使用官方提供的MSAL缓存扩展包,内置跨平台加密存储能力,不需要自己实现序列化、加密逻辑:
- 安装NuGet包
Microsoft.Identity.Client.Extensions.Msal - 在构建完
IPublicClientApplication实例后,绑定持久化缓存,修改后的初始化代码如下:
// 指定本地缓存文件路径 string cacheDir = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData), "AzDoTaskRunner"); Directory.CreateDirectory(cacheDir); string cachePath = Path.Combine(cacheDir, "msal_token_cache.bin"); // 配置跨平台加密存储规则 var storageConfig = new StorageCreationPropertiesBuilder(cachePath, "AzDoTaskRunner") .WithLinuxKeyring( schemaName: "com.azdotaskrunner.cache", collection: "default", secretLabel: "MSAL token cache for Azure DevOps operations", attributeKey1: "ClientId", attributeValue1: ClientId) .WithMacKeyChain( serviceName: "com.azdotaskrunner.cache", accountName: "MSALCache") // Windows环境默认使用DPAPI加密当前用户可读的缓存文件,不需要额外配置 .Build(); Application = PublicClientApplicationBuilder.Create(ClientId) .WithAuthority(Authority) .WithDefaultRedirectUri() .Build(); // 注册持久化缓存到客户端 var cacheHelper = await MsalCacheHelper.CreateAsync(storageConfig); cacheHelper.RegisterCache(Application.UserTokenCache);
完成上述配置后,你原来写的令牌获取逻辑完全不需要修改:第一次启动走设备码流程登录后,缓存会自动加密写入本地文件,后续启动时GetAccountsAsync()就能直接读到已登录的账户,只要缓存内的刷新令牌未过期,AcquireTokenSilent会自动获取新的访问令牌,不需要重复交互式登录。
自定义存储(Blob/其他持久化位置)
如果需要把缓存存到Azure Blob、数据库等非本地存储位置,不需要依赖扩展包,自己实现两个缓存回调即可:
- 注册
UserTokenCache.SetBeforeAccess回调:MSAL读取缓存前触发,从你的自定义存储位置拉取缓存字节流,加载到内存缓存中 - 注册
UserTokenCache.SetAfterAccess回调:缓存发生变更(新令牌生成、账户更新、令牌过期移除)时触发,把当前内存缓存的字节流序列化后写入自定义存储
注意:令牌缓存中包含可长期使用的刷新令牌,属于高敏感凭证,无论存储到什么位置,都必须做加密处理,禁止明文存储。
注意事项
- 当缓存内的刷新令牌过期(默认有效期90天,受租户策略、用户主动撤销权限影响),
AcquireTokenSilent会抛出MsalUiRequiredException,此时捕获异常重新走设备码登录流程即可,新的令牌会自动覆盖更新到持久化缓存中 - 你当前是控制台/后台程序场景,不要使用Cookie存储,Cookie是浏览器Web场景的存储方案,不适用于这类原生客户端程序
内容的提问来源于stack exchange,提问作者Mark McGookin
相关产品推荐
相关产品推荐

