C# MS Bot框架不';我不记得身份验证了
我正在开发一个带有v4框架的MS机器人,并尝试设置身份验证。问题是我可以进行身份验证,但是如果我想通过重新启动对话框(找到)来重新获取用户身份验证令牌,那么我会得到一个新的loginprompt,而不仅仅是检索令牌 这就是我们所尝试的: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提供程序
- 使用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)
}