C# MS Bot框架不';我不记得身份验证了

C# MS Bot框架不';我不记得身份验证了,c#,.net,azure-active-directory,botframework,C#,.net,Azure Active Directory,Botframework,我正在开发一个带有v4框架的MS机器人,并尝试设置身份验证。问题是我可以进行身份验证,但是如果我想通过重新启动对话框(找到)来重新获取用户身份验证令牌,那么我会得到一个新的loginprompt,而不仅仅是检索令牌 这就是我们所尝试的: 使用Azure AD v1和v2 搜索文档(但总是不推荐使用或与链接中的相同) 我的代码(如果您需要其他信息,请随时询问): //注册Promt AddDialog(提示符(ConnectionName)); //提示用户使用连接名称指定的OAuth提供程序

我正在开发一个带有v4框架的MS机器人,并尝试设置身份验证。问题是我可以进行身份验证,但是如果我想通过重新启动对话框(找到)来重新获取用户身份验证令牌,那么我会得到一个新的loginprompt,而不仅仅是检索令牌

这就是我们所尝试的:

  • 使用Azure AD v1和v2
  • 搜索文档(但总是不推荐使用或与链接中的相同)
我的代码(如果您需要其他信息,请随时询问):

//注册Promt
AddDialog(提示符(ConnectionName));
//提示用户使用连接名称指定的OAuth提供程序登录。
//提示定义
公共静态OAuthPrompt提示符(string connectionName)=>new OAuthPrompt(
登录名,
新的OAuthPromptSettings
{
ConnectionName=ConnectionName,
Text=“请登录”,
Title=“登录”,
超时=300000,//用户有5分钟登录时间
});
专用异步任务PromptStepAsync(WaterWallStepContext上下文,CancellationToken CancellationToken)
{
var state=await UserProfileAccessor.GetAsync(context.context);
返回wait context.BeginDialogAsync(LoginPromptName,cancellationToken:cancellationToken);
}
专用异步任务LoginStepAsync(WaterCallStepContext上下文,CancellationToken CancellationToken)
{
var loginState=await UserProfileAccessor.GetAsync(context.context);
//从上一步获取令牌。请注意,我们还可以获取
//直接从提示符本身获取令牌。下一个方法中有一个例子。
var tokenResponse=(tokenResponse)context.Result;
if(令牌响应!=null)
{
*登录时执行某些操作*
}
其他的
{
*登录失败时执行某些操作*
}
/* !! 
这里的问题不是检查用户是否
已登录并正在检索令牌I
获得一个新的登录屏幕。
!!
*/
var token2Response=wait context.BeginDialogAsync(LoginPromptName,null,cancellationToken)
}
因此,基本上我希望检索用户令牌,以便在用户登录时可以检查不同的方法和对话框。

这是由于以下错误造成的:,当前需要修复此错误

目前的解决方法是确保bot在结束对话框之前获得任何类型的其他用户响应。样本中包含:

return await stepContext.PromptAsync(nameof(confirmport),newpromptoptions{Prompt=MessageFactory.Text(“是否要查看您的令牌?”)},cancellationToken);
我在
*中测试了将此添加到您的代码在登录时会起作用*
,效果良好:


感谢您的回复抱歉让您久等了。还有一个问题:这意味着在这个时候,如果用户不输入魔术号码,就无法让用户登录?一些客户端需要6位代码,但不是所有客户端都需要。在Emulator中,取消选中设置中的“使用OAuth卡的登录验证码”框。对于网络聊天,您需要
// Register the Promt
AddDialog(Prompt(ConnectionName));

// Prompts the user to log in using the OAuth provider specified by the connection name.
// Prompt definition
public static OAuthPrompt Prompt(string connectionName) => new OAuthPrompt(
       LoginPromptName,
       new OAuthPromptSettings
       {
           ConnectionName = connectionName,
           Text = "Please login",
           Title = "Login",
           Timeout = 300000, // User has 5 minutes to login
       });

private async Task<DialogTurnResult> PromptStepAsync(WaterfallStepContext context, CancellationToken cancellationToken)
{
    var state = await UserProfileAccessor.GetAsync(context.Context);
    return await context.BeginDialogAsync(LoginPromptName, cancellationToken: cancellationToken);
}

private async Task<DialogTurnResult> LoginStepAsync(WaterfallStepContext context, CancellationToken cancellationToken)
{
    var loginState = await UserProfileAccessor.GetAsync(context.Context);
    // Get the token from the previous step. Note that we could also have gotten the
    // token directly from the prompt itself. There is an example of this in the next method.
    var tokenResponse = (TokenResponse)context.Result;
    if (tokenResponse != null)
    {
       * DOES SOMETHING WHEN LOGGED IN*
    }
    else
    {
       * DOES SOMETHING WHEN LOGIN FAILED *
    }


    /* !! 
       HERE IS THE PROBLEM IN STEAD OF CHECKING IF THE USER 
       IS ALREADY LOGGED IN AND JUST RETRIEVING THE TOKEN I
       GET A NEW LOGIN SCREEN.
       !!
    */
    var token2Response = await context.BeginDialogAsync(LoginPromptName, null, cancellationToken)


}