我的目标是在 Teams 机器人中获取 SSO 令牌。下面的代码是我尝试以最基本的方式使其工作的尝试。 为了响应任何输入,将执行一个运行
TeamsBotSsoPrompt
的瀑布对话框。我确认所有设置都正确,没有例外。
行
return await ssoPrompt.BeginDialogAsync(stepContext, _dialogState, cancellationToken);
执行时没有错误。
进入代码,我发现
TeamsBotSsoPrompt
调用 await SendOAuthCardToObtainTokenAsync(dialogContext.get_Context(), cancellationToken).ConfigureAwait(continueOnCapturedContext: false);
,这是我看到的最后一个事件。 Teams 中没有输出。
我的机器人中的最后一个活动迹象是调用我的覆盖
OnTeamsSigninVerifyStateAsync()
。
我访问令牌的瀑布的第二步从未到达。
我需要做什么才能获得令牌?
using Microsoft.Bot.Builder;
using Microsoft.Bot.Builder.Teams;
using Microsoft.Bot.Schema;
using Microsoft.Bot.Builder.Dialogs;
using DataPlatformBot.SSO;
using Microsoft.TeamsFx.Bot;
using Microsoft.Extensions.Options;
using Microsoft.TeamsFx.Configuration;
namespace DataPlatformBot;
public class TeamsBot : TeamsActivityHandler
{
readonly ILogger<TeamsBot> _logger;
readonly SsoDialog _ssoDialog;
readonly IStatePropertyAccessor<DialogState> _dialogState;
readonly BotAuthenticationOptions _botAuthOptions;
readonly BotState _conversationState;
public TeamsBot(ConversationState conversationState, IOptions<BotAuthenticationOptions> botAuthOptions, SsoDialog ssoDialog, ILogger<TeamsBot> logger)
{
_ssoDialog = ssoDialog;
_logger = logger;
_conversationState = conversationState;
_dialogState = _conversationState.CreateProperty<DialogState>("DialogState");
_botAuthOptions = botAuthOptions.Value;
}
protected override async Task OnMessageActivityAsync(ITurnContext<IMessageActivity> turnContext, CancellationToken cancellationToken)
{
var wd = new WaterfallDialog("SsoWaterfall", new List<WaterfallStep> {
async (stepContext, cancellationToken) => {
var ssoSettings = new TeamsBotSsoPromptSettings(_botAuthOptions, new string[] { "User.Read" });
var ssoPrompt = new TeamsBotSsoPrompt(nameof(TeamsBotSsoPrompt), ssoSettings);
return await ssoPrompt.BeginDialogAsync(stepContext, _dialogState, cancellationToken);
},
async (stepContext, cancellationToken) => {
var tokenResponse = (TeamsBotSsoPromptTokenResponse)stepContext.Result;
return await stepContext.EndDialogAsync();
}
});
await wd.RunAsync(turnContext, _dialogState, cancellationToken);
}
protected override async Task OnTeamsSigninVerifyStateAsync(ITurnContext<IInvokeActivity> turnContext, CancellationToken cancellationToken)
{
_logger.LogInformation("Receive invoke activity of teams sign in verify state");
}
public override async Task OnTurnAsync(ITurnContext turnContext, CancellationToken cancellationToken = default(CancellationToken))
{
await base.OnTurnAsync(turnContext, cancellationToken);
}
}