Autenticación mejorada de Direct Line

SE APLICA A: SDK v4

En este artículo se describen los posibles riesgos de seguridad cuando los usuarios se conectan a un bot, por ejemplo, mediante el control Chat en web. Además, muestra la mitigación de soluciones mediante la configuración de autenticación mejorada de Direct Line y el control de identificadores de usuario seguros.

Hay dos identidades de usuario:

  • Identidad del usuario del canal. Un atacante puede usarlo para suplantación.
  • La identidad del usuario del proveedor de identidades que usa el bot para autenticar al usuario. Un atacante puede usarlo para suplantación de identidad.

Suplantación

La suplantación hace referencia a la acción de un atacante que hace que el bot piense que son otra persona. Por ejemplo, en Chat en web, el atacante puede suplantar a otra persona cambiando el identificador de usuario de la instancia de Chat en web.

Mitigación de suplantación

  • Haga que el identificador de usuario no se pueda usar.

  • Conectar un bot a Direct Line.

  • Habilite la opción de autenticación mejorada del canal de Direct Line para permitir que Azure AI Bot Service detecte y rechace aún más cualquier cambio de identificador de usuario. Esto significa que el identificador de usuario (Activity.From.Id) de los mensajes de Direct Line al bot siempre será el mismo que el que usó para inicializar el control Chat en web.

    Nota:

    Direct Line crea un token basado en el secreto de Direct Line e inserta en User.Id el token. Garantiza que los mensajes enviados al bot tienen que como User.Id la actividad .From.Id Si un cliente envía un mensaje a Direct Line que tiene un valor diferente From.Id, se cambiará al identificador insertado en el token antes de reenviar el mensaje al bot. Por lo tanto, no puede usar otro identificador de usuario después de inicializar un secreto de canal con ese identificador.

    Esta característica requiere que el identificador de usuario empiece por dl_ , como se muestra a continuación.

    Sugerencia

    Para un bot regional, establezca dlUrl según la región seleccionada.
    Si está seleccionado europa, establezca "https://europe.directline.botframework.com/v3/directline/tokens/generate".
    Si seleccionó india, establezca "https://india.directline.botframework.com/v3/directline/tokens/generate".
    Para más información sobre los bots regionales, consulte Regionalización en 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);
        }
    }    
    
    

    El token generado, basado en el secreto de Direct Line, se usa después en el control Chat en web, como se muestra a continuación:

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

Suplantación de identidad

La suplantación de identidad hace referencia a la acción de un atacante que asume la identidad de un usuario legítimo y, a continuación, usa esa identidad para lograr un objetivo malintencionado.

Cuando un bot pide al usuario de canal A que inicie sesión en un proveedor de identidades, el proceso de inicio de sesión debe asegurarse de que el usuario A es el único que inicia sesión en el proveedor. Si otro usuario también puede iniciar sesión en el proveedor, tendría acceso a los recursos de usuario A a través del bot.

Mitigación de suplantación de identidad de usuario

En el control Chat en web, hay dos mecanismos para asegurarse de que el usuario adecuado ha iniciado sesión.

  1. Código mágico. Al final del inicio de sesión, se presenta al usuario un código de 6 dígitos generado aleatoriamente (código mágico). El usuario debe escribir este código en la conversación para completar el proceso de inicio de sesión. Esto tiende a dar lugar a una mala experiencia de usuario. Además, es susceptible a ataques de suplantación de identidad (phishing); un usuario malintencionado puede engañar a otro usuario para iniciar sesión y obtener el código mágico.

  2. Autenticación mejorada de Direct Line. Use la autenticación mejorada de Direct Line para garantizar que el proceso de inicio de sesión solo se pueda completar en la misma sesión del explorador que el cliente de Chat en web.

    Para habilitar esta protección, inicie Chat en web con un token de Direct Line que contenga una lista de dominios de confianza que pueden hospedar el cliente de Chat en web del bot. Con las opciones de autenticación mejoradas, puede especificar estáticamente la lista de dominios de confianza (orígenes de confianza) en la página de configuración de Direct Line. Consulte la sección Configuración de la autenticación mejorada.