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

Microsoft Graph 5.19.0:如何在多Worker VM间共享Token缓存?

解决方案

你遇到的核心问题是AuthenticationRecord仅绑定当前设备,无法跨设备复用。要实现多端共享认证状态,需要自定义MSAL的TokenCache持久化逻辑,而非仅依赖AuthenticationRecord。

关键思路

MSAL的TokenCache才是存储刷新令牌、访问令牌等核心认证数据的容器,默认的本地持久化(比如Windows DPAPI、macOS Keychain)是设备绑定的。要实现跨设备共享,必须:

  • 禁用默认的设备绑定持久化
  • 自定义TokenCache的序列化/反序列化逻辑,将缓存数据存储到多端可访问的共享存储(如数据库、Blob存储)
  • 确保应用注册包含offline_access权限(必须获取刷新令牌才能实现长期复用)

代码实现示例

  1. 自定义TokenCache序列化工具类
// 自定义工具类,负责TokenCache与共享存储的读写交互
public static class SharedTokenCacheHelper
{
    // 替换为你的共享存储读取逻辑(如Azure Blob、SQL数据库)
    public static async Task<byte[]> ReadTokenCacheAsync(string mailbox)
    {
        // 示例:从共享存储读取缓存字节数组
        return await GetFromSharedStorage($"token-cache-{mailbox}");
    }

    // 替换为你的共享存储写入逻辑
    public static async Task WriteTokenCacheAsync(string mailbox, byte[] cacheData)
    {
        // 示例:将缓存字节数组写入共享存储
        await SaveToSharedStorage($"token-cache-{mailbox}", cacheData);
    }
}
  1. 配置Credential并绑定自定义缓存逻辑
// 初始化Credential选项
_interactiveCredentialOptions = new InteractiveBrowserCredentialOptions
{
    TenantId = tenantId,
    ClientId = clientId,
    AuthorityHost = AzureAuthorityHosts.AzurePublicCloud,
    RedirectUri = new Uri("http://localhost"),
    // 禁用默认设备绑定持久化,指定自定义缓存标识
    TokenCachePersistenceOptions = new TokenCachePersistenceOptions
    {
        Name = $"shared-cache-{mailbox}",
        UnsafeAllowUnencryptedStorage = false // 生产环境必须加密存储
    }
};

// 创建Credential实例
var credential = new InteractiveBrowserCredential(_interactiveCredentialOptions);

// 加载已有的共享缓存数据
var existingCacheData = await SharedTokenCacheHelper.ReadTokenCacheAsync(mailbox);
if (existingCacheData != null && existingCacheData.Length > 0)
{
    credential.TokenCache.DeserializeMsalV3(existingCacheData);
}

// 注册缓存变更回调,自动同步到共享存储
credential.TokenCache.SetAfterAccessAsync(async args =>
{
    if (args.HasStateChanged)
    {
        await SharedTokenCacheHelper.WriteTokenCacheAsync(mailbox, credential.TokenCache.SerializeMsalV3());
    }
});

// 初始化GraphServiceClient
var graphClient = new GraphServiceClient(credential);

注意事项

  • 权限配置:在Azure AD应用注册中,必须添加offline_access委托权限,并确保用户授权时同意该权限,否则无法获取刷新令牌,跨设备复用会失效。
  • 缓存安全性:TokenCache包含敏感的刷新令牌,务必加密后再存储到共享位置,比如用Azure Key Vault对缓存数据加密,避免泄露。
  • 并发控制:多端同时读写缓存时,要加分布式锁(如Redis锁、数据库锁),防止缓存数据冲突导致认证失败。
  • 刷新令牌生命周期:默认刷新令牌有效期为90天,MSAL会自动刷新令牌,缓存变更回调会同步新的缓存数据到共享存储,无需手动处理。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.15 04:06:19