我们计划将BoT部署为一种帮助台,以接受查询并根据用户的文本提出支持票据。我们希望将我们的BoT与我们自己的AD集成以进行身份验证。如果AD身份验证不起作用,那么我们的计划B就是说我们在我们的网页中托管BoT作为网络聊天BoT,并且所有身份验证都在Web应用程序中完成。但是,当我们想要代表他提出一些支持票时,我们仍然需要捕获登录到Web应用程序的用户。知道如何登录用户详细信息可以从托管网页传递到BoT。托管网页可以是Azure或本地实施。
AuthBoT是唯一的解决方法,使用哪个用户将被重定向到Web应用程序进行登录,并且魔术代码将被验证并发送回BoT。我们是否有一种无缝的身份验证方式,而不需要重定向到另一个网页进行身份验证?
我的客户不想转到其他网页并输入他的凭据以在此处进行身份验证。他想要更加无缝的身份验证。在某种程度上,他是对的,因为他已经对自己进行了身份验证并登录了网页,BoT是他网页中的另一个片段。他的观点是为什么我们需要再次登录,为什么BoT无法从托管网页中获取身份验证/令牌。这里有什么建议吗?
答案 0 :(得分:4)
有几种方法可以解决你的情况。
据我了解,当客户端使用聊天机器人窗口小部件到达网页时,用户已通过网页对您的网站进行了身份验证。
编辑:我添加了第三种方法,这是在网页和嵌入式网页聊天框之间进行通信的首选方式。
方法1:
将用户凭据(身份验证令牌)传输到页面内的聊天机器人的一种方法是使用服务器身份验证端点的凭据开始与用户进行新对话。< /强>
然而,为了使其正常工作,您需要用户的IAddress 。换句话说,用户必须先与您的机器人进行过对话,而您必须将其存储在某个地方,也许是在数据库中。
例如,这里是您的服务器代码(这是在NodeJS中):
//where user is sent after authenticating through web page
server.post("/authenticated", function(req, res){
//get user iaddress from database using credentials
//(you will need the Iaddress of the user to begin a dialog)
var address = getAddressFromDB(req.body.credentials)
//then use beginDialog to start a new dialog with the user you just authenticated
//(this dialog route will only be accessible from here to guarantee authentication)
bot.beginDialog(address, "/authenticated", { userAuthToken: auth_token });
//success
res.status(200);
res.end();
});
//user is sent here from the above bot.beginDialog() call
bot.dialog("/authenticated", function(session, args){
//extract credentials (auth token) from args
var authToken = args.userAuthToken;
//use auth token here.......
});
然后,您将执行常规逻辑,以在机器人对话框端点创建和处理支持服务单。如果在以后的对话路由中需要authToken
,则甚至可以将session
存储在session.userData.authToken = authToken;
对象中。
//begin user authentication here
bot.dialog("/get_username", [
function(session){
//prompt user for username here
botbuilder.Prompts.text(session, "Hello, what is your username?");
},
function(session, results){
//store username
session.userData.username = results.response;
//begin new dialogue
session.beginDialog("/get_password");
}
]);
bot.dialog("/get_password", [
function(session){
//prompt user for password here
botbuilder.Prompts.text(session, "What is your password?");
},
function(session, results){
//store password
session.userData.password = results.response;
//check credentials
if(checkCredentials(session.userData.username, session.userData.password){
//good credentials, send to post-authentication dialog
session.beginDialog("/authenticated");
} else {
//bad credentials
//reset user data and retry
session.userData.username = "";
session.userData.password = "";
session.beginDialog("/get_username");
}
}
]);
方法2:
您可以通过瀑布式对话框通过聊天窗口本身对用户进行身份验证的另一种方式。 然而,这并不能真正解决用户进行两次身份验证的问题,但它可以解决用户不得不离开当前网页进行身份验证的问题。
机器人会引导用户完成输入凭证的过程:
{{1}}
You can actually check out a working example of the above Method 2 code here.
方法3:
让网页与嵌入式WebChat机器人通信的首选方式是Direct Line REST API,它允许您创建一个&#34;反向信道。&#34;
使用WebChat控件(which you can download and learn about from the repo here),您可以设置嵌入式机器人及其所在的网页,通过收听和广播您定义的事件来相互通信。
You can see a great example of this by checking out this example code that shows the client side.
While this code demonstrates what the bot & server-side code is doing behind the scenes.
然后,您可以使用此方法让您的机器人从您的网页中侦听身份验证活动,并在用户进行身份验证时,使用附加的所需凭据广播该活动,以便机器人可以使用它们。
我希望这有帮助!