Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/271.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# Microsoft团队bot-链接展开身份验证流_C#_Botframework_Microsoft Teams - Fatal编程技术网

C# Microsoft团队bot-链接展开身份验证流

C# Microsoft团队bot-链接展开身份验证流,c#,botframework,microsoft-teams,C#,Botframework,Microsoft Teams,找不到用于链接展开的验证流的好示例。我设法使用运行oauth流。但在用户提供的登录名和密码以及bot点击OnTeamsAppBasedLinkQueryAsync第二次GetUserTokenAsync后,仍然返回null。所以我不知道当身份验证流完成时,我应该从哪里获得令牌。我应该坚持吗?团队是否会在每次请求时向我发送令牌,或者它应该如何工作 因此,在我的情况下,以下代码总是返回null: var tokenResponse = await (turnContext.Adapter as IU

找不到用于链接展开的验证流的好示例。我设法使用运行oauth流。但在用户提供的登录名和密码以及bot点击
OnTeamsAppBasedLinkQueryAsync
第二次
GetUserTokenAsync
后,仍然返回null。所以我不知道当身份验证流完成时,我应该从哪里获得令牌。我应该坚持吗?团队是否会在每次请求时向我发送令牌,或者它应该如何工作

因此,在我的情况下,以下代码总是返回null:

var tokenResponse = await (turnContext.Adapter as IUserTokenProvider)
    .GetUserTokenAsync(turnContext, _connectionName, default(string),
        cancellationToken: cancellationToken);

AppBasedLinkQuery
上似乎没有“状态”字段。验证流完成后,将再次调用
OnTeamsAppBasedLinkQueryAsync
,并且
turnContext.Activity.Value
将包含url和“状态”(或魔法代码)。我们将此字段添加到
AppBasedLinkQuery
(在此处创建了一个问题:)

解决方法是直接从
活动.Value
中检索状态/magiccode,例如:

受保护的异步覆盖任务OnTeamsAppBasedLinkQueryAsync(ITurnContext turnContext、AppBasedLinkQuery查询、CancellationToken CancellationToken)
{
var magicCode=string.Empty;
var state=(turnContext.Activity.Value作为Newtonsoft.Json.Linq.JObject.Value(“state”);
如果(!string.IsNullOrEmpty(状态))
{
int-parsed=0;
if(int.TryParse(state,out-parsed))
{
magicCode=parsed.ToString();
}
}
var tokenResponse=await(turnContext.Adapter作为IUserTokenProvider).GetUserTokenAsync(turnContext,_connectionName,magicCode,cancellationToken:cancellationToken);
if(tokenResponse==null | | string.IsNullOrEmpty(tokenResponse.Token))
{
//没有令牌,因此用户尚未登录。
//检索要在MessagingExtensionResult建议操作中使用的OAuth登录链接
var signInLink=await(turnContext.Adapter作为IUserTokenProvider)。GetOauthSignInLinkAsync(turnContext,_connectionName,cancellationToken);
返回新的MessagingExtensionResponse
{
ComposeExtension=新消息扩展结果
{
Type=“auth”,
SuggestedActions=新消息扩展SuggestedAction
{
操作=新列表
{
新名片
{
Type=ActionTypes.OpenUrl,
值=符号链接,
Title=“Bot服务OAuth”,
},
},
},
},
};
}
var heroCard=新的拇指指甲卡
{
Title=“缩略图卡”,
Text=query.Url,
图像=新列表{新图像(“https://raw.githubusercontent.com/microsoft/botframework-sdk/master/icon.png") },
};
var attachments=新的MessagingExtensionAttachment(HeroCard.ContentType,null,HeroCard);
var result=新MessagingExtensionResult(“列表”、“结果”、新[]{attachments});
返回新的MessagingExtensionResponse(结果);
}

看起来您传递的是
默认值(字符串)
而不是“魔法代码”?在你的链接上方几行有一条评论说,“当机器人服务验证流完成时,action.State将包含一个用于验证的魔法代码。”是的,但该方法的文档说明magicCode是可选的:我相信代码是用于短信确认之类的。无论如何,它在展开流中不可用,因为AppBasedLinkQuery只有一个Url属性。它确实如此。很抱歉。你能查一下代码样本吗?是的,我读了好几遍。问题是我没有对话框,我处于链接展开流中,所以我没有状态,无法发送消息。你是说有什么具体的事我要查一下吗?