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

Teams应用SSO场景下无需二次消息获取用户Token方案

解决Teams SSO无需二次消息自动获取Token的方案

方法1:利用Teams静默SSO流程(推荐)

既然已完成管理员租户级授权,用户无需授权提示,就该直接用Teams原生的静默SSO机制,而非手动发送OAuthCard——后者属于手动授权流程,不符合预授权后的无交互需求。

  • 直接调用Bot Framework的GetUserTokenAsync方法,传入连接名并设置magicCode: null。管理员预授权生效时,Teams会在后台自动完成token获取,全程无需用户操作:
var tokenResponse = await turnContext.TokenExchangeState.GetTokenResponseAsync(turnContext, connectionName);
if (tokenResponse == null)
{
    // 触发静默SSO而非发送OAuthCard
    var oauthPrompt = new OAuthPrompt(connectionName, new OAuthPromptSettings { ConnectionName = connectionName });
    var promptContext = new PromptContext(turnContext, null);
    await oauthPrompt.BeginDialogAsync(promptContext, null, CancellationToken.None);
}
else
{
    var hebbenwetokenhier = tokenResponse.Token;
    // 后续业务逻辑处理
}
  • 校验点:确认Bot注册的SSO配置中权限范围正确,且管理员已完成租户级权限授予,否则静默流程会失效。

方法2:监听TokenExchange事件(兼容OAuthCard场景)

如果必须保留OAuthCard流程,可通过监听TokenExchangeInvokeActivity事件实现自动获取token,无需用户二次发消息。该事件会在用户完成OAuthCard授权后由Teams自动触发:

  • 在Bot的OnTurnAsync方法中增加Invoke事件判断:
public override async Task OnTurnAsync(ITurnContext turnContext, CancellationToken cancellationToken = default)
{
    if (turnContext.Activity.Type == ActivityTypes.Invoke)
    {
        if (turnContext.Activity.Name == "tokenExchange")
        {
            var tokenResponse = await turnContext.TokenExchangeState.GetTokenResponseAsync(turnContext, connectionName);
            if (tokenResponse != null)
            {
                var hebbenwetokenhier = tokenResponse.Token;
                // 处理token逻辑,比如给用户发送确认消息
                await turnContext.SendActivityAsync(MessageFactory.Text("已成功获取授权"), cancellationToken);
            }
        }
    }
    else if (turnContext.Activity.Type == ActivityTypes.Message)
    {
        var tokenResponse = await turnContext.TokenExchangeState.GetTokenResponseAsync(turnContext, connectionName);
        if (tokenResponse == null)
        {
            var oauthCard = new OAuthCard
            {
                Text = "请完成授权",
                ConnectionName = connectionName,
                Buttons = new List<CardAction> { new CardAction { Type = ActionTypes.Signin, Title = "登录", Value = await turnContext.GetSignInResourceAsync(connectionName) } }
            };
            await turnContext.SendActivityAsync(MessageFactory.Attachment(new Attachment { Content = oauthCard, ContentType = OAuthCard.ContentType }), cancellationToken);
        }
        else
        {
            // 已有token的业务逻辑
        }
    }
    await base.OnTurnAsync(turnContext, cancellationToken);
}

关键注意事项

  • 确保Bot Manifest文件的webApplicationInfo节点配置正确:id设为Bot的Client ID,resource设为目标API的Client ID或资源URI。
  • 管理员授权必须是租户级,否则用户仍会看到授权提示,静默SSO无法生效。
  • 优先使用静默SSO流程,这是Teams SSO设计的无交互授权标准方式,避免手动OAuthCard带来的额外交互步骤。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.04 23:47:14