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

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_

    提示

    对于区域机器人,请根据所选区域进行设置 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。 如果还允许其他用户登录提供程序,他们将有权通过机器人访问用户 A 资源。

用户标识欺骗缓解

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

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

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

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