Autenticação aprimorada de linha direta

APLICA-SE A: SDK v4

Este artigo descreve possíveis riscos de segurança quando os usuários se conectam a um bot, por exemplo, usando o controle Web Chat . Além disso, ele mostra soluções atenuantes usando as configurações de autenticação aprimoradas de Linha Direta e o tratamento seguro de ID do usuário.

Há duas identidades de usuário:

  • A identidade do usuário do canal. Um invasor pode usá-lo para representação.
  • A identidade do usuário do provedor de identidade que o bot usa para autenticar o usuário. Um invasor pode usá-lo para falsificação de identidade.

Representação

A representação refere-se à ação de um invasor que faz o bot pensar que é outra pessoa. Por exemplo, no Chat da Web, o invasor pode se passar por outra pessoa alterando o ID do usuário da instância do Web Chat.

Mitigação de representação

  • Torne o ID do usuário imprevisível.

  • Conecte um bot à Linha Direta.

  • Habilite a opção de autenticação aprimorada do canal de Linha Direta para permitir que o Serviço de Bot de IA do Azure detecte e rejeite ainda mais qualquer alteração de ID de usuário. Isso significa que o ID do usuário (Activity.From.Id) nas mensagens da Linha Direta para o bot será sempre o mesmo que você usou para inicializar o controle do Web Chat.

    Observação

    A Linha Direta cria um token com base no segredo da Linha Direta e incorpora o User.Id no token. Ele garante que as mensagens enviadas ao bot tenham isso User.Id como atividade From.Id. Se um cliente enviar uma mensagem para a Linha Direta com um From.Id, ela será alterada para o ID incorporado no token antes de encaminhar a mensagem para o bot. Portanto, você não pode usar outro ID de usuário depois que um segredo de canal é inicializado com esse ID.

    Esse recurso requer o ID do usuário para começar dl_ , conforme mostrado abaixo.

    Dica

    Para um bot regional, defina dlUrl de acordo com a região selecionada.
    Se selecionado europe, defina "https://europe.directline.botframework.com/v3/directline/tokens/generate".
    Se selecionado índia, defina "https://india.directline.botframework.com/v3/directline/tokens/generate".
    Para obter mais informações sobre bots regionais, consulte Regionalização no Serviço de Bot de IA do Azure.

    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);
        }
    }    
    
    

    O token gerado, com base no segredo da Linha Direta, é usado no controle Web Chat, conforme mostrado abaixo:

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

Falsificação de identidade

Falsificação de identidade refere-se à ação de um invasor que assume a identidade de um usuário legítimo e, em seguida, usa essa identidade para realizar uma meta mal-intencionada.

Quando um bot pede ao usuário do canal A para entrar em um provedor de identidade, o processo de entrada deve garantir que o usuário A seja o único que entra no provedor. Se outro usuário também tiver permissão para entrar no provedor, ele terá acesso aos recursos do usuário A por meio do bot.

Mitigação de falsificação de identidade do usuário

No controle WebChat, há dois mecanismos para garantir que o usuário correto esteja conectado.

  1. Código mágico. Ao final do processo para iniciar sessão, o usuário recebe um código de seis dígitos gerado aleatoriamente (código mágico). O usuário deve digitar esse código na conversa para concluir o processo para iniciar sessão. Isso tende a resultar em uma experiência ruim para o usuário. Além disso, é suscetível a ataques de phishing; Um usuário mal-intencionado pode enganar outro usuário para entrar e obter o código mágico.

  2. Autenticação avançada do Direct Line. Use a autenticação aprimorada de Linha Direta para garantir que o processo de entrada só possa ser concluído na mesma sessão do navegador que o cliente de Web Chat.

    Para habilitar essa proteção, inicie o Web Chat com um token de Linha Direta que contém uma lista de domínios confiáveis que podem hospedar o cliente de Web Chat do bot. Com as opções de autenticação aprimoradas, você pode especificar estaticamente a lista de domínios confiáveis (origens confiáveis) na página Configuração de Linha Direta. Consulte a seção Configurar autenticação avançada.