Partilhar via


Adicionar logon único a um bot

APLICA-SE A: SDK v4

Este artigo mostra como usar o recurso de logon único (SSO) em um bot. Para fazer isso, esse recurso usa um bot de consumidor — também conhecido como bot raiz ou pai — para interagir com um bot de habilidade ou filho . Este artigo usa os termos bot raiz e skill bot.

Se você incluir suporte a SSO, um usuário poderá entrar no bot raiz usando um provedor de identidade e não precisará entrar novamente quando o controle passar para uma habilidade.

Os bots raiz e de habilidade são bots separados, executados em servidores potencialmente diferentes, cada um com sua própria memória e estado separados. Para obter mais informações sobre habilidades, consulte Visão geral de habilidades e Implementar uma habilidade. Para obter mais informações sobre autenticação de usuário, consulte Noções básicas de autenticação do Bot Framework, Autenticação de usuário e Adicionar autenticação a um bot.

Importante

Quando você usa a autenticação do Serviço de Bot do Azure AI com o Chat da Web, há algumas considerações de segurança importantes que você deve ter em mente. Para obter mais informações, consulte a seção de considerações de segurança no artigo Autenticação REST.

Pré-requisitos

Sobre a amostra

Este artigo faz referência a dois bots: o RootBot e o SkillBot. O RootBot encaminha atividades para o SkillBot. Eles modelam este cenário típico de habilidade:

  • Um bot raiz chama um ou mais bots de habilidade.
  • Os bots raiz e de habilidade implementam a autenticação básica descrita no artigo Adicionar autenticação a um bot .
  • O usuário efetua login no bot raiz.
  • Por causa do SSO e já estar conectado ao bot raiz, eles são conectados ao bot de habilidades sem exigir a interação do usuário novamente.

Para obter uma visão geral de como o Bot Framework lida com a autenticação, consulte Autenticação de usuário. Para obter informações básicas sobre SSO, consulte Logon único.

O RootBot suporta SSO. Ele se comunica com o SkillBot em nome do usuário, sem que o usuário seja obrigado a se autenticar novamente no _SkillBot.

Para cada projeto no exemplo, você precisa do seguinte:

  1. Um aplicativo Microsoft Entra ID para registrar um recurso de bot no Azure.
  2. Um aplicativo de provedor de identidade do Microsoft Entra ID para autenticação.

    Nota

    Atualmente, apenas o provedor de identidade Microsoft Entra ID é suportado.

Criar o recurso Azure RootBot

  1. Crie um recurso de bot do Azure no portal do Azure para o RootBot. Siga as etapas descritas em Criar um recurso de bot do Azure.
  2. Copie e salve o ID do aplicativo de registro do bot e o segredo do cliente.

Criar a identidade de ID do Microsoft Entra para o RootBot

O Microsoft Entra ID é um serviço de identidade na nuvem que permite criar aplicativos que entram com segurança nos usuários usando protocolos padrão do setor, como o OAuth2.0.

  1. Crie um aplicativo de identidade para o que usa o RootBot Microsoft Entra ID para autenticar o usuário. Siga as etapas descritas em Criar o provedor de identidade do Microsoft Entra ID.

  2. No painel esquerdo, selecione Manifesto.

  3. Definido accessTokenAcceptedVersion como 2.

  4. Selecione Guardar.

  5. No painel esquerdo, selecione Expor uma API.

  6. No painel direito, selecione Adicionar um escopo.

  7. Na extremidade direita Adicionar uma seção de escopo , selecione Salvar e continuar.

  8. Na janela exibida, em Quem pode consentir?, selecione Administradores e usuários.

  9. Insira as informações necessárias restantes.

  10. Selecione Adicionar escopo.

  11. Copie e salve o valor do escopo.

Criar uma configuração de conexão OAuth para o RootBot

  1. Crie uma conexão Microsoft Entra ID no registro do bot e insira os RootBot valores conforme descrito em Microsoft Entra ID e o valor descrito abaixo.

  2. Deixe a URL do Token Exchange vazia.

  3. Na caixa Escopos, insira o valor do RootBot escopo salvo nas etapas anteriores.

    Nota

    Scopes contém a URL na qual o usuário entra inicialmente no bot raiz, enquanto a URL da troca de token é deixada vazia.

    Como exemplo, vamos supor que o appid do bot raiz seja rootAppId e o appid do bot de habilidade seja skillAppId. Os escopos do bot raiz serão parecidos com api://rootAppId/customScope, que é usado para fazer login no usuário. Os escopos desse bot raiz são então trocados com api://skillAppId/customscope durante o SSO.

  4. Copie e salve o nome da conexão.

Criar o recurso do Azure SkillBot

  1. Crie um recurso de bot do Azure no portal do Azure para o SkillBot. Siga as etapas descritas em Criar um recurso de bot do Azure.
  2. Copie e salve o ID do aplicativo de registro do bot e o segredo do cliente.

Criar a identidade Microsoft Entra ID para o SkillBot

O Microsoft Entra ID é um serviço de identidade na nuvem que permite criar aplicativos que entram com segurança nos usuários usando protocolos padrão do setor, como o OAuth2.0.

  1. Crie um aplicativo de identidade para o que usa o SkillBot Microsoft Entra ID para autenticar o bot. Siga as etapas descritas em Criar o provedor de identidade do Microsoft Entra ID.

  2. No painel esquerdo, selecione Manifesto.

  3. Definido accessTokenAcceptedVersion como 2.

  4. Selecione Guardar.

  5. No painel esquerdo, selecione Expor uma API.

  6. No painel direito, selecione Adicionar um escopo.

  7. Na seção Adicionar um escopo à direita, selecione Salvar e continuar.

  8. Na janela exibida, em Quem pode consentir? , selecione Administradores e usuários.

  9. Insira as informações necessárias restantes.

  10. Selecione Adicionar escopo.

  11. Copie e salve o valor do escopo.

  12. Selecione Adicionar um aplicativo cliente. Na seção mais à direita, na caixa ID do cliente, digite o ID do aplicativo de identidade do RootBot que você salvou antes. Certifique-se de usar a identidade do RootBot e não o ID do aplicativo de registro.

    Nota

    Para aplicativos cliente, o Serviço de Bot do Azure AI não oferece suporte a um único sing-on com o provedor de identidade B2C do Microsoft Entra ID.

  13. Em Escopo autorizado, marque a caixa pelo valor do escopo.

  14. Selecione Adicionar aplicativo.

  15. No painel de navegação à esquerda, selecione Permissões de API. É uma prática recomendada definir explicitamente as permissões de API para o aplicativo.

    1. No painel direito, selecione Adicionar uma permissão.

    2. Selecione APIs da Microsoft e, em seguida, Microsoft Graph.

    3. Escolha Permissões delegadas e verifique se as permissões necessárias estão selecionadas. Este exemplo requer as permissões listadas abaixo.

      Nota

      Qualquer permissão marcada como CONSENTIMENTO DE ADMINISTRADOR NECESSÁRIO exigirá que um usuário e um administrador de locatário façam login.

      • OpenID
      • perfil
      • Usuário.Read
      • Usuário.ReadBasic.All
    4. Selecione Adicionar permissões.

Criar uma configuração de conexão OAuth para o SkillBot

  1. Crie uma conexão Microsoft Entra ID no registro do bot e insira os SkillBot valores conforme descrito em Microsoft Entra ID e os valores descritos abaixo.

  2. Na caixa URL da Troca de Tokens, insira o valor do SkillBot escopo salvo nas etapas anteriores.

  3. Na caixa Escopos, insira os seguintes valores separados por espaço em branco: openidprofile User.Read User.ReadBasic.All .

  4. Copie e salve em um arquivo o nome da conexão.

Testar a ligação

  1. Selecione na entrada de conexão para abrir a conexão que você criou.
  2. Selecione Testar Conexão na parte superior do painel Configuração de Conexão do Provedor de Serviços.
  3. Na primeira vez, isso deve abrir uma nova guia do navegador listando as permissões que seu aplicativo está solicitando e solicitar que você aceite.
  4. Selecione Aceitar.
  5. Isso deve redirecioná-lo para uma conexão de teste para <sua página de nome> de conexão bem-sucedida .

Para obter mais informações, consulte a visão geral do Microsoft Entra ID para desenvolvedores (v1.0) e a visão geral da plataforma de identidade da Microsoft (v2.0). Para obter informações sobre as diferenças entre os pontos de extremidade v1 e v2, consulte Por que atualizar para a plataforma de identidade da Microsoft (v2.0)?. Para obter informações completas, consulte Plataforma de identidade da Microsoft (anteriormente Microsoft Entra ID para desenvolvedores).

Preparar o código de exemplo

Você deve atualizar o appsettings.json arquivo em ambos os exemplos, conforme descrito abaixo.

  1. Clone o SSO com o exemplo Simple Skill Consumer and Skill do repositório GitHub.

  2. Abra o arquivo de SkillBot projeto appsettings.json . Atribua os seguintes valores do arquivo salvo:

    {
        "MicrosoftAppId": "<SkillBot registration app ID>",
        "MicrosoftAppPassword": "<SkillBot registration password>",
        "ConnectionName": "<SkillBot connection name>",
        "AllowedCallers": [ "<RootBot registration app ID>" ]
    }
    
    
  3. Abra o arquivo de RootBot projeto appsettings.json . Atribua os seguintes valores do arquivo salvo:

    {
        "MicrosoftAppId": "<RootBot registration app ID>",
        "MicrosoftAppPassword": "<RootBot registration password>",
        "ConnectionName": "<RootBot connection name>",
        "SkillHostEndpoint": "http://localhost:3978/api/skills/",
        "BotFrameworkSkills": [
                {
                "Id": "SkillBot",
                "AppId": "<SkillBot registration app ID>",
                "SkillEndpoint": "http://localhost:39783/api/messages"
                }
            ]
    }
    

Testar as amostras

Use o seguinte para testes:

  • RootBot comandos

    • login permite que o usuário entre no registro do Microsoft Entra ID usando o RootBot. Uma vez conectado, o SSO cuida do login no SkillBot também. O usuário não precisa entrar novamente.
    • token Exibe o token do usuário.
    • logout Efetua logout do usuário do RootBotarquivo .
  • SkillBot comandos

    • skill login permite que o RootBot para entrar no SkillBot, em nome do usuário. Não será mostrada uma placa de entrada ao usuário, se já estiver conectado, a menos que o SSO falhe.
    • skill token Exibe o token do usuário do SkillBot.
    • skill logout desconecta o usuário do SkillBot

Nota

Na primeira vez que os usuários tentarem SSO em uma habilidade, eles poderão receber um cartão OAuth para fazer login. Isso ocorre porque eles ainda não deram consentimento para o aplicativo Microsoft Entra ID da habilidade. Para evitar isso, eles podem conceder consentimento de administrador para quaisquer permissões de gráfico solicitadas pelo aplicativo Microsoft Entra ID.

Se você ainda não fez isso, instale o Bot Framework Emulator. Consulte também Depurar com o emulador.

Você precisará configurar o emulador para que o login de exemplo de bot funcione. Use as etapas abaixo: conforme mostrado em Configurar o emulador para autenticação.

Depois de configurar o mecanismo de autenticação, você pode executar o teste de amostra de bot real.

  1. No Visual Studio, abra a solução e configure-a para iniciar a SSOWithSkills.sln depuração com vários processos.

  2. Comece a depurar localmente na sua máquina. Observe que noRootBot arquivo de projeto appsettings.json você tem as seguintes configurações:

    "SkillHostEndpoint": "http://localhost:3978/api/skills/"
    "SkillEndpoint": "http://localhost:39783/api/messages"
    

    Nota

    Essas configurações implicam que, com ambos RootBot e SkillBot estão sendo executados na máquina local. O emulador se comunica com RootBot na porta 3978 e RootBot se comunica com SkillBot na porta 39783. Assim que você iniciar a depuração, duas janelas padrão do navegador serão abertas. Um na porta 3978 e outro na porta 39783.

  3. Inicie o emulador.

  4. Quando você se conectar ao bot, insira o RootBot ID e a senha do aplicativo de registro.

  5. Digite hi para iniciar a conversa.

  6. Insira o login. O RootBot exibirá um cartão de autenticação Entrar no AAD .

    Exemplo de um cartão de início de sessão.

  7. Selecione Entrar. A caixa de diálogo pop-up Confirmar URL aberto é exibida.

    Captura de ecrã da mensagem de confirmação 'URL aberto'.

  8. Selecione Confirmar. Você será conectado e o RootBot token será exibido.

  9. Insira o token para exibir o token novamente.

    Exemplo de uma mensagem exibindo o token raiz.

    Agora você está pronto para se comunicar com o SkillBot. Depois de assinar usando o RootBot, você não precisa fornecer suas credenciais novamente até sair. Isso demonstra que o SSO está funcionando.

  10. Digite login de habilidade na caixa Emulador. Não lhe será pedido para iniciar sessão novamente. Em vez disso, o token do SkillBot é exibido.

  11. Insira o token de habilidade para exibir o token novamente.

  12. Agora você pode inserir o logout de habilidade para sair do SkillBot. Em seguida, digite logout para sair do SimpleRootBoot.

Informações adicionais

O diagrama de sequência temporal a seguir se aplica aos exemplos usados no artigo e mostra a interação entre os vários componentes envolvidos. ABS significa Azure AI Bot Service (Serviço de Bot de IA do Azure).

Diagrama de sequência ilustrando o fluxo do token de habilidade.

  1. Na primeira vez, o usuário insere o login comando para o RootBot.
  2. O RootBot envia um OAuthCard solicitando que o usuário faça login.
  3. O usuário insere as credenciais de autenticação que são enviadas para o ABS (Azure AI Bot Service).
  4. O ABS envia o token de autenticação, gerado com base nas credenciais do usuário, para o RootBot.
  5. O RootBot exibe o token raiz para o usuário ver.
  6. O usuário insere o skill login comando para o SkillBot.
  7. O SkillBot envia um OAuthCard para o RootBot.
  8. O RootBot pede um token trocável da ABS.
  9. O SSO envia o token de habilidade do SkillBot para o RootBot.
  10. O RootBot exibe o token de habilidade para o usuário ver. Observe que o token de habilidade foi gerado sem que o usuário precise entrar no SKillBot. Isso ocorre por causa do SSO.

O exemplo a seguir mostra como a troca de token acontece. O código é do arquivo TokenExchangeSkillHandler.cs .

private async Task<bool> InterceptOAuthCards(ClaimsIdentity claimsIdentity, Activity activity)
{
    var oauthCardAttachment = activity.Attachments?.FirstOrDefault(a => a?.ContentType == OAuthCard.ContentType);
    if (oauthCardAttachment != null)
    {
        var targetSkill = GetCallingSkill(claimsIdentity);
        if (targetSkill != null)
        {
            var oauthCard = ((JObject)oauthCardAttachment.Content).ToObject<OAuthCard>();

            if (!string.IsNullOrWhiteSpace(oauthCard?.TokenExchangeResource?.Uri))
            {
                using (var context = new TurnContext(_adapter, activity))
                {
                    context.TurnState.Add<IIdentity>("BotIdentity", claimsIdentity);

                    // AAD token exchange
                    try
                    {
                        var result = await _tokenExchangeProvider.ExchangeTokenAsync(
                            context,
                            _connectionName,
                            activity.Recipient.Id,
                            new TokenExchangeRequest() { Uri = oauthCard.TokenExchangeResource.Uri }).ConfigureAwait(false);

                        if (!string.IsNullOrEmpty(result?.Token))
                        {
                            // If token above is null, then SSO has failed and hence we return false.
                            // If not, send an invoke to the skill with the token. 
                            return await SendTokenExchangeInvokeToSkill(activity, oauthCard.TokenExchangeResource.Id, result.Token, oauthCard.ConnectionName, targetSkill, default).ConfigureAwait(false);
                        }
                    }
                    catch
                    {
                        // Show oauth card if token exchange fails.
                        return false;
                    }

                    return false;
                }
            }
        }
    }
    return false;
}