如何在Microsoft Teams消息扩展应用中存储第三方访问令牌?
Teams消息扩展令牌持久化存储方案
官方推荐方案:使用Bot Framework用户令牌存储机制
Bot Framework内置的User Token Store是Teams场景下持久化用户令牌的标准方案,支持跨会话、跨应用重启保留令牌,无需自行实现复杂的存储逻辑。
具体实现步骤
- 存储令牌
在获取到UserToken对象后,通过IUserTokenClient保存令牌:
// 构造函数注入IUserTokenClient(Bot服务配置时自动注册) private readonly IUserTokenClient _userTokenClient; public YourBotHandler(IUserTokenClient userTokenClient) { _userTokenClient = userTokenClient; } // 在OnTeamsMessagingExtensionFetchTaskAsync方法中执行存储逻辑 if (state != null) { var userToken = JsonConvert.DeserializeObject<UserToken>(state); await _userTokenClient.SaveTokenAsync( turnContext.Activity.From.Id, "YourAppUniqueConnection", // 自定义唯一连接名称 turnContext.Activity.TenantId, new TokenResponse { Token = userToken.AccessToken, RefreshToken = userToken.RefreshToken, ExpiresOn = DateTime.UtcNow.AddHours(1) // 按实际令牌过期时间设置 }, cancellationToken); }
- 调用API时获取令牌
后续需要调用业务API时,直接从存储中读取:
var tokenResponse = await _userTokenClient.GetTokenAsync( turnContext.Activity.From.Id, "YourAppUniqueConnection", turnContext.Activity.TenantId, cancellationToken); if (tokenResponse != null && !string.IsNullOrEmpty(tokenResponse.Token)) { // 使用tokenResponse.Token调用你的业务API } else { // 令牌不存在/过期,触发重新登录流程 }
- 令牌自动刷新
当令牌过期时,利用存储的RefreshToken更新令牌:
// 假设你有自定义的令牌刷新方法 var refreshedToken = await RefreshYourAppToken(tokenResponse.RefreshToken); // 更新存储中的令牌 await _userTokenClient.SaveTokenAsync( turnContext.Activity.From.Id, "YourAppUniqueConnection", turnContext.Activity.TenantId, new TokenResponse { Token = refreshedToken.AccessToken, RefreshToken = refreshedToken.RefreshToken, ExpiresOn = DateTime.UtcNow.AddHours(1) }, cancellationToken);
备选方案:Azure持久化存储服务
如果需要更灵活的存储控制,可使用Azure Table Storage或Cosmos DB,以用户ID+租户ID作为唯一标识:
// 示例:Azure Table Storage存储 var tokenEntity = new TokenEntity { PartitionKey = turnContext.Activity.TenantId, RowKey = turnContext.Activity.From.Id, AccessToken = userToken.AccessToken, RefreshToken = userToken.RefreshToken, ExpiryDate = DateTime.UtcNow.AddHours(1) }; await _azureTableClient.AddEntityAsync(tokenEntity, cancellationToken);
关键注意事项
- 加密存储:令牌属于敏感信息,Bot Framework的User Token Store默认加密;使用Azure存储需开启服务端加密。
- 多租户隔离:必须用
租户ID+用户ID作为标识,避免不同租户/用户的令牌混淆。 - 过期检测:每次获取令牌时检查过期时间,提前触发刷新逻辑,减少用户重复登录操作。
内容的提问来源于stack exchange,提问作者sjones
相关产品推荐
相关产品推荐

