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

如何在Microsoft Teams消息扩展应用中存储第三方访问令牌?

Teams消息扩展令牌持久化存储方案

官方推荐方案:使用Bot Framework用户令牌存储机制

Bot Framework内置的User Token Store是Teams场景下持久化用户令牌的标准方案,支持跨会话、跨应用重启保留令牌,无需自行实现复杂的存储逻辑。

具体实现步骤

  1. 存储令牌
    在获取到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);
}
  1. 调用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
{
    // 令牌不存在/过期,触发重新登录流程
}
  1. 令牌自动刷新
    当令牌过期时,利用存储的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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.03 20:46:07