如何从嵌入iframe的BotFramework聊天机器人URL中获取动态sess值
获取Web Chat嵌入时的sess动态值用于认证
嘿,我来帮你搞定这个问题!你想要获取iframe里的sess动态值来做用户认证,其实这个参数会通过Web Chat的**通道数据(Channel Data)**传递给你的Bot,不用依赖ConnectorClient来拿——那个类主要是用来发送消息或者管理会话的,不是干这个的。
下面是具体的实现步骤,针对Bot Framework v4(现在主流都是v4啦):
1. 从Activity的ChannelData中提取sess值
当用户打开嵌入的Web Chat时,不管是触发会话初始化(MembersAdded事件)还是发送第一条消息,Bot都会收到包含Web Chat参数的Activity。你可以从turnContext.Activity.ChannelData里拿到sess值:
示例1:在用户发送消息时获取
protected override async Task OnMessageActivityAsync(ITurnContext<IMessageActivity> turnContext, CancellationToken cancellationToken) { // 检查ChannelData是否存在并包含Web Chat相关数据 if (turnContext.Activity.ChannelData != null) { var channelData = JObject.FromObject(turnContext.Activity.ChannelData); if (channelData.ContainsKey("webchat")) { var webChatParams = channelData["webchat"] as JObject; // 提取sess动态值 var sessValue = webChatParams["sess"]?.ToString(); if (!string.IsNullOrEmpty(sessValue)) { // 这里可以加入你的用户认证逻辑,比如验证sess的有效性 await turnContext.SendActivityAsync(MessageFactory.Text($"已获取到会话标识:{sessValue}"), cancellationToken); } } } // 你的其他消息处理逻辑 await base.OnMessageActivityAsync(turnContext, cancellationToken); }
示例2:在会话初始化时就获取(无需用户发消息)
如果想在用户打开Web Chat的第一时间就拿到sess值做认证,可以在OnMembersAddedAsync方法里处理:
protected override async Task OnMembersAddedAsync(IList<ChannelAccount> membersAdded, ITurnContext<IConversationUpdateActivity> turnContext, CancellationToken cancellationToken) { foreach (var member in membersAdded) { // 排除Bot自己,只处理用户加入的情况 if (member.Id != turnContext.Activity.Recipient.Id) { if (turnContext.Activity.ChannelData != null) { var channelData = JObject.FromObject(turnContext.Activity.ChannelData); if (channelData.ContainsKey("webchat")) { var webChatParams = channelData["webchat"] as JObject; var sessValue = webChatParams["sess"]?.ToString(); if (!string.IsNullOrEmpty(sessValue)) { // 执行认证逻辑,比如校验sess对应的用户身份 await turnContext.SendActivityAsync(MessageFactory.Text($"欢迎!已验证你的会话标识:{sessValue}"), cancellationToken); } } } } } }
2. 注意事项
- 确保你的iframe嵌入代码里的
sess=dynamic_value是正确动态生成的,比如从你的后端服务获取有效标识再拼到URL里。 - 上面的代码需要引入
Newtonsoft.Json(Bot Framework默认会引用这个包),所以要确保你的项目里有这个依赖。 - 如果你还在使用Bot Framework v3,逻辑类似,但需要从
Activity.ChannelData里提取,写法会略有不同,不过建议升级到v4哦。
内容的提问来源于stack exchange,提问作者Pramod Gupta
相关产品推荐
相关产品推荐

