从对话框到机器人类的身份验证令牌

时间:2019-08-23 09:27:01

标签: c# oauth botframework

我正在运行一个OAuth对话框,该对话框允许用户登录。我希望将Auth令牌从DialogsClass.cs中获取到我的Bot.Cs类文件中,并使用它进行Graph调用。

我试图将令牌另存为字符串,并将其保存在对话框类中的本地文件中,然后在bot主类中将其读回,但是此解决方案似乎不是正确的方法。

瀑布步骤中的AuthDialog.cs:

var tokenResponse = (TokenResponse)stepContext.Result;

预期结果。将此令牌从Dialog类转移到MainBot.cs类,并用作字符串来进行Graph调用。

2 个答案:

答案 0 :(得分:1)

您是否使用一个瀑布步骤来使用OAuthPrompt获取令牌,然后又使用另一步骤来调用其他类(您在其中进行图形api调用)? 为什么不能只将令牌传递给下游类?

如果中间还有其他步骤,则有多种解决方法:

答案 1 :(得分:1)

Microsoft建议不要将令牌存储在系统中,而是拨打oAuth提示 return await stepContext.BeginDialogAsync(nameof(OAuthPrompt), null, cancellationToken); 并在需要调用Graph API时获取最新令牌。在var tokenResponse = (TokenResponse)stepContext.Result;中收到令牌后  您可以调用GraphClient类,该类将使用Authorization属性中的令牌创建Graph API客户端。

var client = new GraphClientHelper(tokenResponse.Token);

Graph Client实现:

  public GraphClientHelper(string token)
    {
        if (string.IsNullOrWhiteSpace(token))
        {
            throw new ArgumentNullException(nameof(token));
        }
        _token = token;
    }
   private GraphServiceClient GetAuthenticatedClient()
    {
        var graphClient = new GraphServiceClient(
            new DelegateAuthenticationProvider(
                requestMessage =>
                {
                    // Append the access token to the request.
                    requestMessage.Headers.Authorization = new AuthenticationHeaderValue("bearer", _token);

                    // Get event times in the current time zone.
                    requestMessage.Headers.Add("Prefer", "outlook.timezone=\"" + TimeZoneInfo.Local.Id + "\"");

                    return Task.CompletedTask;
                }));
        return graphClient;
    }

一旦创建了图形客户端,您就可以调用所需的图形api:

 await client.CreateMeeting(meetingDetails).ConfigureAwait(false);

请参考以下示例代码: Graph Sample