如何在Bot Framework中使用TeamsBotSsoPrompt?

问题描述 投票:0回答:1

我的目标是在 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);
    }
}
c# botframework teams-toolkit
1个回答
0
投票

请参阅此 wiki 了解如何使用 TeamsFx SDK 实施 SSO。您可以在此处找到示例代码。

© www.soinside.com 2019 - 2024. All rights reserved.