你当前正在访问 Microsoft Azure Global Edition 技术文档网站。 如果需要访问由世纪互联运营的 Microsoft Azure 中国技术文档网站,请访问 https://docs.azure.cn

Direct Line 增强身份验证

适用于: SDK v4

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

有两个用户标识:

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

模仿

模拟是指攻击者通过冒充他人身份使机器人误认为他们是别人的行为。 例如,在网上聊天中,攻击者可以通过更改 Web Chat 实例 的用户 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_

    小窍门

    对于区域机器人,请根据所选区域进行设置 dlUrl
    如果选择了欧洲,则设置“https://europe.directline.botframework.com/v3/directline/tokens/generate"”。
    如果选择印度,请设置“https://india.directline.botframework.com/v3/directline/tokens/generate"。
    有关区域机器人的详细信息,请参阅 Azure AI 机器人服务中的区域化

    public class HomeController : Controller
    {
        private const string secret = "<TODO: DirectLine secret>";
        private const string dlUrl = "https://directline.botframework.com/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 资源。

用户身份伪造防范

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

  1. 魔法代码。 在登录过程结束时,用户会显示一个随机生成的 6 位代码(magic code)。 用户必须在聊天中键入此代码才能完成登录过程。 这往往会导致用户体验不佳。 此外,它容易受到网络钓鱼攻击;恶意用户可以欺骗其他用户登录并获取 magic 代码。

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

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