为什么不直接使用 DL 秘密呢?
正如您所说,这将允许访问与机器人的所有对话。
如果普通视图中的 JS 代码使用 DirectLine 机密来获取令牌,然后使用该令牌进行身份验证,则使用令牌似乎无法完成任何操作,因为 DL 机密已暴露。
再次正确。为了隐藏您的秘密,您需要设置自己的令牌服务器。我们没有关于如何设置的官方现成示例,但是此示例由网络聊天作者提供应该可以帮助你开始。
如果你想自己编写,流程基本上是:
- 让您的 WebChat 客户端向您的令牌服务器发送令牌请求
- 只要您不公开代码,您的令牌服务器就可以将秘密存储在变量中。让您的令牌服务器联系
https://directline.botframework.com/v3/directline/tokens/generate
使用 POST 请求和标头,Authorization: Bearer <YourSecret>
- Return the token that results from that request back to the WebChat client
- 您的 WebChat 客户端现在将拥有一个令牌,而无需知道秘密,因为它使用了您的令牌服务器中间件
Microsoft 推荐的、最简单的对上面链接的网络聊天控件进行身份验证的方法是什么?
不幸的是,没有一种方法既“简单”又“推荐”。最简单的就是直接使用你的秘密。如果您不关心用户对话会被暴露,那么这很好。不过,推荐的方法是实现您自己的令牌服务器。
关于揭露秘密的补充阅读
From 这个 GitHub 问题
出于本次讨论的目的,我们将把秘密和令牌视为同一件事。如果您愿意,我们可以稍后详细讨论。我现在将它们称为“秘密/令牌”。
要访问对话,您需要密钥/令牌和对话 ID。这些值有时粘合在一起,有时位于单独的变量中。有时它们位于 URL 中,有时它们存储在内存中的 JavaScript 中。它们类似于存储在用户 cookie 中的用户令牌。
在所有情况下,坐在自己计算机上的用户都可以访问这些值。他们可以读取自己的 URL,可以读取自己的 JavaScript 变量状态,还可以读取自己的 cookie。
如果他们将任何此类信息发送给其他人,该人就可以冒充他们。如果我的银行通过电子邮件向我发送密码重置链接,并且我与其他人共享该链接,则该人可以重置我的帐户密码并登录我的帐户。
我们的 iFrame 使用 URL 来传递这些参数,因为在许多情况下这已经是足够的安全级别。 (您是否曾经访问过某个网站,手动将 URL 提取到 iFrame,将其发送给其他人,并期望您的会话保持私密?可能不会。)
如果您想要额外的安全性,您可以跳过 iFrame 并在 JS 或 cookie 中发送您自己的秘密/令牌。您的 JS 可以提取该内容并将其发送到 Web Chat JS 对象。一旦 Web Chat 拥有秘密/令牌,就会专门使用 HTTP 授权标头将这些值发送到 Direct Line 服务。
所以,让你的秘密暴露并不是一个big deal, per se。但是,它确实允许恶意用户冒充任何其他用户。
This is默认行为,因为 Directline 需要some确定与谁交谈经过身份验证的方法。该秘密验证客户端(网络聊天)是否正常。但是什么可以验证用户的身份呢?用户 ID?但是任何用户都可以设置自己的用户 ID 并冒充其他人。真正确保这一点的唯一方法是在您自己的一端实施一些操作,使用该密钥来获取 Directline 令牌,然后将其传递回 Web 聊天客户端。
此外,为了获取对话数据,有人需要两个秘密and对话是。找出对话 ID 的可能性非常小。
但一般来说,只有当您尝试保留用户数据时,这种安全性才是一个问题。如果您的用户每次打开机器人时都会开始新的对话,您只需生成一个唯一的用户 ID,而不必担心秘密是否会暴露。
这是一篇关于在 C# 和 Node 中创建客户端控制器(令牌服务器)的好博客文章
以及一些额外的安全功能/概念。.
这是另一篇关于其他安全注意事项和使用增强型 DirectLine 身份验证功能的博客文章