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
相关产品推荐
相关产品推荐

