Direct Line 增強驗證

適用於: SDK v4

本文說明用戶連線到 Bot 時的潛在安全性風險,例如使用 網路聊天 控件。 此外,它也會顯示使用 Direct Line 增強驗證設定和保護使用者標識碼處理的緩和解決方案。

有兩個使用者身分識別:

  • 通道使用者的身分識別。 攻擊者可以使用它進行 模擬
  • Bot 用來驗證使用者的識別提供者的使用者身分識別。 攻擊者可以使用它進行 身分識別詐騙

模擬

仿真是指讓 Bot 認為自己是其他人的攻擊者動作。 例如,在 網路聊天 中,攻擊者可以藉由變更 網路聊天 實例的使用者標識碼來模擬其他人。

模擬風險降低

  • 讓使用者識別碼 無法辨解。

  • 連線 Bot 至 Direct Line

  • 啟用 Direct Line 通道的 增強驗證 選項,以允許 Azure AI Bot 服務進一步偵測和拒絕任何使用者識別碼變更。 這表示從 Direct Line 到 Bot 的訊息上的使用者識別碼一Activity.From.Id律會與您用來初始化 網路聊天 控件的使用者識別元相同。

    注意

    Direct Line 會根據 Direct Line 秘密建立 令牌 ,並將內嵌 User.Id 在令牌中。 它會確保傳送至 Bot 的From.Id訊息具有User.Id作為活動的 。 如果用戶端將訊息傳送至具有不同 From.Id的 Direct Line,則會在將訊息轉送至 Bot 之前,將它變更為 內嵌在令牌 中的標識碼。 因此,在使用該識別元初始化通道密碼之後,您無法使用另一個使用者識別碼。

    此功能需要使用者標識碼以 開頭 dl_ ,如下所示。

    提示

    針對區域 Bot,請根據選取的區域進行設定 dlUrl
    如果選取了歐洲,請設定 “https://europe.directline.botframework.com/v3/directline/tokens/generate"。
    如果選取印度,請設定 “https://india.directline.botframework.com/v3/directline/tokens/generate"。
    如需區域 Bot 的詳細資訊,請參閱 Azure AI Bot Service 中的區域化。

    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 秘密,然後在 網路聊天 控件中使用,如下所示:

    @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>
    
    

身分識別詐騙

身分識別詐騙是指攻擊者的動作,該攻擊者假設合法使用者的身分識別,然後使用該身分識別來完成惡意目標。

當 Bot 要求通道使用者 A 登入識別提供者時,登入程式必須確保使用者 A 是唯一登入提供者的使用者。 如果另一位使用者也允許登入提供者,他們就能透過 Bot 存取使用者 A 資源。

使用者身分識別詐騙風險降低

在 網路聊天 控件中,有兩種機制可確保適當的使用者已登入。

  1. Magic 程式代碼。 在登入程序結束時,使用者會看到隨機產生的6位數代碼(magiccode)。 用戶必須在交談中輸入此程序代碼,才能完成登入程式。 這可能會導致用戶體驗不佳。 此外,它很容易遭受網路釣魚攻擊;惡意使用者可以欺騙其他使用者登入並取得魔術程序代碼。

  2. Direct Line 增強驗證。 使用 Direct Line 增強驗證來確保登入程式只能在與 網路聊天 用戶端相同的瀏覽器會話完成。

    若要啟用此保護,請使用 Direct Line 令牌啟動 網路聊天,其中包含可裝載 Bot 網路聊天 用戶端的信任網域清單。 使用增強的驗證選項,您可以在 [Direct Line 組態] 頁面中,以靜態方式指定受信任的網域 (受信任來源) 清單。 請參閱設定 增強式驗證 一節。