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

如何将Azure AD PublicClientApplication令牌持久化存储到磁盘

根本原因

默认通过PublicClientApplicationBuilder构建的IPublicClientApplication实例,令牌缓存是纯内存级的,进程退出后内存被系统回收,缓存的账户、令牌数据会全部清空,这和Azure侧配置无关,不需要在Azure门户做任何特殊调整。

实现方法

要实现跨启动的缓存持久化,只需要给客户端实例的用户令牌缓存注册序列化回调,把缓存数据写入持久化存储即可,你原有业务逻辑不需要改动。

本地磁盘持久化(推荐命令行/本地短生命周期程序使用)

直接使用官方提供的MSAL缓存扩展包,内置跨平台加密存储能力,不需要自己实现序列化、加密逻辑:

  1. 安装NuGet包Microsoft.Identity.Client.Extensions.Msal
  2. 在构建完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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.30 01:42:16