Direct Line 增强身份验证

适用于: SDK v4

本文介绍了用户(例如)使用网络聊天控件连接到机器人时的潜在安全风险。 此外,它还演示了使用 Direct Line 增强身份验证设置和安全用户 ID 处理方式的缓解解决方案。

有两个用户标识:

  • 通道用户标识。 攻击者可以使用它进行模拟
  • 机器人用于对用户进行身份验证的标识提供者的用户标识。 攻击者可以使用它进行标识欺骗

模拟

冒充是指攻击者的行为,攻击者使机器人认为他们是其他人。 例如,在网上聊天中,攻击者可能会通过更改网上聊天实例的用户 ID 来模拟其他某人。

模拟缓解操作

  • 使用不可猜出的用户 ID。

  • 将机器人连接到 Direct Line

  • 启用 Direct Line 通道的增强身份验证选项,以允许 Azure AI 机器人服务进一步检测并拒绝任何用户 ID 更改。 这意味着,从 Direct Line 发送到机器人的消息中的用户 ID (Activity.From.Id) 将始终与用于初始化网上聊天控件的用户 ID 相同。

    注意

    Direct Line 根据 Direct Line 机密创建一个令牌,并将 User.Id 嵌入令牌中。 它确保发送到机器人的消息具有 User.Id 作为活动的 From.Id。 如果客户端向 Direct Line 发送的消息具有不同的 From.Id,则在将消息转发给机器人之前,它将被更改为嵌入在令牌中的 ID。 因此,在用另一个用户 ID 初始化通道机密后,不能使用该 ID。

    此功能要求用户 ID 以 dl_ 开头,如下所示。

    提示

    有关区域机器人的更多信息,请参阅 Azure AI 机器人服务中的区域化

    public class HomeController : Controller
    {
        private const string secret = "<TODO: DirectLine secret>";
        private const string dlUrl = "https://directline.botframework.azure.cn/v3/directline/tokens/generate";
    
        public async Task<ActionResult> Index()
        {
            HttpClient client = new HttpClient();
            var userId = $"dl_{Guid.NewGuid()}";
    
            HttpRequestMessage request = new HttpRequestMessage(HttpMethod.Post, dlUrl);
            request.Headers.Authorization = new AuthenticationHeaderValue("Bearer", secret);
            request.Content = new StringContent(
                JsonConvert.SerializeObject(
                    new { User = new { Id = userId } }),
                    Encoding.UTF8,
                    "application/json");
    
            var response = await client.SendAsync(request);
    
            string token = String.Empty;
            if (response.IsSuccessStatusCode)
            {
                var body = await response.Content.ReadAsStringAsync();
                token = JsonConvert.DeserializeObject<DirectLineToken>(body).token;
            }
    
            var config = new ChatConfig()
            {
                Token = token,
                UserId = userId
            };
    
            return View(config);
        }
    }    
    
    

    然后,基于 Direct Line 机密生成的令牌在 Web 聊天控件中使用,如下所示:

    @model Bot_Auth_DL_Secure_Site_MVC.Models.ChatConfig
    @{
        ViewData["Title"] = "Home Page";
    }
    <div id="webchat" role="main" />
    <head>
        <script src="https://cdn.botframework.com/botframework-webchat/latest/webchat.js"></script>
    </head>
    <body>
        <script>
          window.WebChat.renderWebChat({
              directLine: window.WebChat.createDirectLine({ token: '@Model.Token' }),
                userID: '@Model.UserId'
          }, document.getElementById('webchat'));
        </script>
    </body>
    
    

身份欺骗

身份欺骗是指攻击者假定合法用户的身份,然后使用该身份实现恶意目标的行为。

当机器人要求通道用户 A 登录到标识提供者时,登录过程必须确保用户 A 是唯一登录到提供者的人。 如果另一个用户也被允许登录提供者,他们将有权通过机器人访问用户 A 资源。

用户身份欺骗缓解

在 Web 聊天控件中,有两种机制可以确保正确的用户登录。

  1. 魔码。 在登录过程结束时,用户会看到一个随机生成的 6 位数代码(魔码)。 用户必须在聊天中键入此代码才能完成登录过程。 这往往会导致糟糕的用户体验。 此外,容易受到网络钓鱼攻击;恶意用户可以欺骗另一个用户登录并获得密码。

  2. Direct Line 增强身份验证。 使用 Direct Line 增强身份验证可以保证登录过程只能在与 Web 聊天客户端相同的浏览器会话中完成。

    若要启用此保护,请使用包含可以托管机器人的 Web 聊天客户端的受信任域列表的 Direct Line 令牌启动 Web 聊天。 使用增强身份验证选项,可以在 Direct Line 配置页面中静态指定受信任的域(受信任的来源)列表。 请参阅配置增强身份验证部分。