Autenticação avançada 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 de bate-papo da Web. Além disso, mostra soluções de mitigação usando as configurações de autenticação aprimorada da 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.

Falsificação de identidade

Personificaçã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 a ID do usuário da instância do Web Chat.

Atenuação da representação

  • Torne o ID de utilizador imprevisível.

  • Conecte um bot ao Direct Line.

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

    Nota

    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 para o bot tenham isso User.Id como atividade From.Id. Se um cliente enviar uma mensagem para a Linha Direta com um arquivo diferente 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.

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

    Gorjeta

    Para um bot regional, defina dlUrl de acordo com a região selecionada.
    Se selecionado europa, defina "https://europe.directline.botframework.com/v3/directline/tokens/generate".
    Se selecionado india, 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 do 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);
        }
    }    
    
    

    O token gerado, com base no segredo da Linha Direta, é então usado no controle de bate-papo da Web, 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

A 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 atingir um objetivo mal-intencionado.

Quando um bot solicita 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 de bate-papo da Web, há dois mecanismos para garantir que o usuário adequado esteja conectado.

  1. Código mágico. No final do processo de início de sessão, é apresentado ao utilizador um código de 6 dígitos gerado aleatoriamente (código mágico). O usuário deve digitar esse código na conversa para concluir o processo de login. 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 aprimorada de linha direta. 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 contenha uma lista de domínios confiáveis que podem hospedar o cliente de Web Chat do bot. Com as opções de autenticação avançadas, você pode especificar estaticamente a lista de domínios confiáveis (origens confiáveis) na página de configuração de Linha Direta. Consulte a seção Configurar autenticação avançada.