Partilhar via


Configurar a autenticação em um agente .NET

O fornecedor de autenticação da Biblioteca de autenticação da Microsoft (MSAL) do SDK de Agentes do .NET é um utilitário que ajuda a criar tokens de acesso para clientes de agente e serviços externos a partir de um agente autoalojado do SDK de Agentes do Microsoft 365.

Este utilitário suporta vários perfis distintos que podem ser usados para criar tokens de acesso. Cada token de acesso pode ser criado usando um dos seguintes tipos de autenticação:

Configurar uma conexão

O fornecedor de autenticação MSAL permite criar e usar vários clientes distintos com o mecanismo de alojamento da estrutura de agentes. Como tal, o fornecedor de autenticação MSAL permite que várias configurações sejam fornecidas no ficheiro de configuração da aplicação, onde cada configuração pode ser usada para criar um cliente de autenticação nomeado para dar suporte a comunicações com serviços externos ou outros agentes.

Há várias definições possíveis que pode usar ao criar uma instância do Fornecedor de Autenticação MSAL.

Essas definições são:

Nome da Definição Tipo Valor padrão Descrição
Tipo de Autenticação AuthTypes Enum (Certificado, CertificateSubjectName, ClientSecret, UserManagedIdentity, SystemManagedIdentity, FederatedCredentials, WorkloadIdentity) ClientSecret Este é o tipo de autenticação que será criado.
AuthorityEndpoint Cadeia (de carateres) Nulo Quando presente, é utilizado como Autoridade para solicitar um token.
Id de Inquilino Cadeia (de carateres) Nulo Quando presente e AuthorityEndpoint é nulo, usado para criar uma Autoridade para solicitar um token
Alcances Lista de cadeias Nulo Listas predefinidas de âmbitos para solicitar tokens. Só é usado quando nenhum âmbito é transmitido do pedido de ligação do agente

Inquilino único com ClientSecret

Nome da Definição Tipo Valor padrão Descrição
ID do Cliente Cadeia (de carateres) Nulo ClientId (AppId) para usar ao criar o token de acesso.
ClientSecret cadeia (de caracteres) Nulo Quando AuthType é ClientSecret, Is Secret associado ao cliente, isso só deve ser usado para fins de teste e desenvolvimento.
AuthorityEndpoint Cadeia (de carateres) Nulo Quando presente, é utilizado como Autoridade para solicitar um token.
Id de Inquilino Cadeia (de carateres) Nulo Quando presente e AuthorityEndpoint é nulo, usado para criar uma Autoridade para solicitar um token
Alcances Lista de cadeias Nulo Listas predefinidas de âmbitos para solicitar tokens. Só é usado quando nenhum âmbito é transmitido do pedido de ligação do agente

Aqui está um exemplo de appsettings para SingleTenantClientSecret para Azure Bot Service:

  "Connections": {
    "ServiceConnection": {
      "Settings": {
        "AuthType": "ClientSecret",
        "ClientId": "{{BOT_ID}}",
        "ClientSecret": "{{BOT_SECRET}}",
        "AuthorityEndpoint": "https://login.microsoftonline.com/{{BOT_TENANT_ID}}",
        "Scopes": [
            "https://api.botframework.com/.default"
          ],
      }
    }
  }

Multi-inquilino com ClientSecret

Nome da Definição Tipo Valor padrão Descrição
ID do Cliente Cadeia (de carateres) Nulo ClientId (AppId) para usar ao criar o token de acesso.
ClientSecret cadeia (de caracteres) Nulo Quando AuthType é ClientSecret, Is Secret associado ao cliente, isso só deve ser usado para fins de teste e desenvolvimento.
AuthorityEndpoint Cadeia (de carateres) Nulo Quando presente, é utilizado como Autoridade para solicitar um token.
Id de Inquilino Cadeia (de carateres) Nulo Quando presente e AuthorityEndpoint é nulo, usado para criar uma Autoridade para solicitar um token
Alcances Lista de cadeias Nulo Listas predefinidas de âmbitos para solicitar tokens. Só é usado quando nenhum âmbito é transmitido do pedido de ligação do agente

Aqui está um exemplo de appsettings para Multi-inquilinoClientSecret para Azure Bot Service:

  "Connections": {
    "ServiceConnection": {
      "Settings": {
        "AuthType": "ClientSecret",
        "ClientId": "{{BOT_ID}}",
        "ClientSecret": "{{BOT_SECRET}}",
        "AuthorityEndpoint": "https://login.microsoftonline.com/botframework.com",
        "Scopes": [
            "https://api.botframework.com/.default"
          ],
      }
    }
  }

UserManagedIdentity

Nome da Definição Tipo Valor padrão Descrição
ID do Cliente Cadeia (de carateres) Nulo ClientId da Identidade Gerida para usar ao criar o token de acesso.

Ao usar os Tipos de Identidade Gerida, o seu anfitrião ou cliente deve estar a ser executado com um Serviço do Azure e ter configurado esse serviço com uma identidade Gerida Atribuída pelo Sistema ou uma identidade Gerida Atribuída pelo Utilizador.

Aqui está um exemplo de appsettings para UserManagedIdentity:

  "Connections": {
    "ServiceConnection": {
      "Settings": {
        "AuthType": "UserManagedIdentity",
        "ClientId": "{{BOT_ID}}",
        "Scopes": [
          "https://api.botframework.com/.default"
        ]
      }
    }
  }

SystemManagedIdentity

Ao usar o tipo de autenticação SystemManagedIdentity, o ID do cliente é ignorado e a identidade gerida pelo sistema para o serviço é usada.

Ao usar os Tipos de Identidade Gerida, o seu anfitrião ou cliente deve estar a ser executado com um Serviço do Azure e ter configurado esse serviço com uma identidade Gerida Atribuída pelo Sistema ou uma identidade Gerida Atribuída pelo Utilizador.

Aqui está um exemplo de appsettings para SystemManagedIdentity o tipo de autenticação:

  "Connections": {
    "ServiceConnection": {
      "Settings": {
        "AuthType": "SystemManagedIdentity",
        "Scopes": [
          "https://api.botframework.com/.default"
        ]
      }
    }
  }

FederatedCredentials

Nome da Definição Tipo Valor padrão Descrição
ID do Cliente Cadeia (de carateres) Nulo ClientId (AppId) para usar ao criar o token de acesso.
AuthorityEndpoint Cadeia (de carateres) Nulo Quando presente, é utilizado como Autoridade para solicitar um token.
Id de Inquilino Cadeia (de carateres) Nulo Quando presente e AuthorityEndpoint é nulo, usado para criar uma Autoridade para solicitar um token
Alcances Lista de cadeias Nulo Listas predefinidas de âmbitos para solicitar tokens. Só é usado quando nenhum âmbito é transmitido do pedido de ligação do agente
FederatedClientId Cadeia (de carateres) Nulo ClientId da Identidade Gerida para usar ao criar o token de acesso.

Aqui está um exemplo de appsettings para FederatedCredentials:

  "Connections": {
    "ServiceConnection": {
      "Settings": {
        "AuthType": "FederatedCredentials",
        "ClientId": "{{BOT_ID}}",
        "AuthorityEndpoint": "https://login.microsoftonline.com/{{BOT_TENANT_ID}}",
        "FederatedClientId": "{{BOT_FEDERATED_ID}}",
        "Scopes": [
          "https://api.botframework.com/.default"
        ]
      }
    }
  }

WorkloadIdentity

Nome da Definição Tipo Valor padrão Descrição
ID do Cliente Cadeia (de carateres) Nulo ClientId (AppId) para usar ao criar o token de acesso.
AuthorityEndpoint Cadeia (de carateres) Nulo Quando presente, é utilizado como Autoridade para solicitar um token.
Id de Inquilino Cadeia (de carateres) Nulo Quando presente e AuthorityEndpoint é nulo, usado para criar uma Autoridade para solicitar um token
Alcances Lista de cadeias Nulo Listas predefinidas de âmbitos para solicitar tokens. Só é usado quando nenhum âmbito é transmitido do pedido de ligação do agente
FederatedTokenFile Cadeia (de carateres) Nulo O ficheiro de token (o mesmo que AKS AZURE_FEDERATED_TOKEN_FILE env var)

Aqui está um exemplo para SingleTenantWorkloadIdentity:

  "Connections": {
    "ServiceConnection": {
      "Settings": {
        "AuthType": "WorkloadIdentity",
        "ClientId": "{{BOT_ID}}",
        "AuthorityEndpoint": "https://login.microsoftonline.com/{{BOT_TENANT_ID}}",
        "FederatedTokenFile": "{{BOT_FEDERATED_TOKENFILE}}",
        "Scopes": [
          "https://api.botframework.com/.default"
        ]
      }
    }
  }

Opções opcionais de asserção de cliente de Credenciais Federadas ou Identidade de Carga de Trabalho

Nome da Definição Tipo Valor padrão Descrição
ID do Cliente Cadeia (de carateres) Nulo ID do cliente para o qual uma asserção assinada é solicitada
TokenEndpoint Cadeia (de carateres) Nulo O ponto final de token pretendido
Reclamações Cadeia (de carateres) Nulo Afirmações a serem incluídas na asserção do cliente
ClientCapabilities Cadeia[] Nulo Capacidades que a aplicação cliente declarou.
  "Connections": {
    "ServiceConnection": {
      "Settings": {
        "AuthType": "WorkloadIdentity",
        "ClientId": "{{BOT_ID}}",
        "AuthorityEndpoint": "https://login.microsoftonline.com/{{BOT_TENANT_ID}}",
        "FederatedTokenFile": "{{BOT_FEDERATED_TOKENFILE}}",
        "Scopes": [
          "https://api.botframework.com/.default"
        ],
        "AssertionRequestOptions": {
            "ClientId": null,
            "TokenEndpoint": null,
            "Claims": null,
            "ClientCapabilities": null,
        }
      }
    }
  }

CertificateSubjectName

Tipo de Autenticação Tipo Valor padrão Descrição
AuthorityEndpoint Cadeia (de carateres) Nulo Quando presente, é utilizado como Autoridade para solicitar um token.
Id de Inquilino Cadeia (de carateres) Nulo Quando presente e AuthorityEndpoint é nulo, usado para criar uma Autoridade para solicitar um token
Alcances Lista de cadeias Nulo Listas predefinidas de âmbitos para solicitar tokens. Só é usado quando nenhum âmbito é transmitido do pedido de ligação do agente
ID do Cliente Cadeia (de carateres) Nulo ClientId (AppId) para usar ao criar o token de acesso.
CertSubjectName Cadeia (de carateres) Nulo Quando AuthType é CertificateSubjectName, este é o nome do assunto que é procurado
CertStoreName Cadeia (de carateres) "Meu" Quando AuthType é CertificateSubjectName ou Certificate, indica em que armazenamento de certificados procurar
ValidCertificateOnly booleano Verdade Requer que o certificado tenha uma cadeia válida.
SendX5C booleano Falso Permite a rotação automática de certificados com a configuração apropriada.

Aqui está um exemplo de appsettings para CertificateSubjectName para SN+I e MultiTenant

  "Connections": {
    "ServiceConnection": {
      "Settings": {
        "AuthType": "CertificateSubjectName",
        "ClientId": "{{BOT_ID}}",
        "CertSubjectName": "{{BOT_CERT_SUBJECTNAME}}",
        "SendX5C": true,
        "AuthorityEndpoint": "https://login.microsoftonline.com/botframework.com",
        "Scopes": [
          "https://api.botframework.com/.default"
        ]
      }
    }
  },

Aqui está um exemplo de appsettings para CertificateSubjectName para SN+I e SingleTenant

  "Connections": {
    "ServiceConnection": {
      "Settings": {
        "AuthType": "CertificateSubjectName",
        "ClientId": "{{BOT_ID}}",
        "CertSubjectName": "{{BOT_CERT_SUBJECTNAME}}",
        "SendX5C": true,
        "AuthorityEndpoint": "https://login.microsoftonline.com/{{BOT_TENANT_ID}}",
        "Scopes": [
          "https://api.botframework.com/.default"
        ]
      }
    }
  },

Certidão

Tipo de Autenticação Tipo Valor padrão Descrição
AuthorityEndpoint Cadeia (de carateres) Nulo Quando presente, é utilizado como Autoridade para solicitar um token.
Id de Inquilino Cadeia (de carateres) Nulo Quando presente e AuthorityEndpoint é nulo, usado para criar uma Autoridade para solicitar um token
Alcances Lista de cadeias Nulo Listas predefinidas de âmbitos para solicitar tokens. Só é usado quando nenhum âmbito é transmitido do pedido de ligação do agente
ID do Cliente Cadeia (de carateres) Nulo ClientId (AppId) para usar ao criar o token de acesso.
CertThumbprint Cadeia (de carateres) Nulo Thumbprint do certificado a carregar, válida apenas quando AuthType é definido como Certificado
CertStoreName Cadeia (de carateres) "Meu" Quando AuthType é CertificateSubjectName ou Certificate, indica em que armazenamento de certificados procurar
ValidCertificateOnly booleano Verdade Requer que o certificado tenha uma cadeia válida.
SendX5C booleano Falso Permite a rotação automática de certificados com a configuração apropriada.

Aqui está um exemplo de appsettings para CertificateSubjectName usar o thumbprint do certificado:

  "Connections": {
    "ServiceConnection": {
      "Settings": {
        "AuthType": "Certificate",
        "ClientId": "{{BOT_ID}}",
        "CertThumbprint": "{{BOT_CERT_THUMBPRINT}}",
        "AuthorityEndpoint": "https://login.microsoftonline.com/botframework.com",
        "Scopes": [
          "https://api.botframework.com/.default"
        ]
      }
    }
  },

Fornecedor de configuração predefinido para MSAL

Para facilitar a configuração, fornecemos uma extensão do fornecedor de serviços para adicionar as definições de configuração predefinidas do MSAL ao seu Agente.

Aqui está um exemplo de fornecedor de configuração MSAL predefinido para um anfitrião Asp.net core:

Numa classe Program.cs.

Isso é gerido pela instância registada IConnections . Isso é adicionado por predefinição ao usar AddAgent.

// Register your AgentApplication
builder.AddAgent<MyAgent>();

No entanto, se não estiver a utilizar AddAgent, a instância IConnections deve ser registada.

    // Add Connections object to access configured token connections.
    builder.Services.AddSingleton<IConnections, ConfigurationConnections>();

Opções adicionais de configuração do MSAL

Há várias opções de configuração partilhadas que controlam as definições gerais para adquirir tokens do Microsoft Entra Identity.

Essas definições são:

Nome da Definição Tipo Valor padrão Descrição
MSALRequestTimeout TimeSpan 30segundos Esta definição controla quanto tempo o cliente aguardará por uma resposta do Entra ID após um pedido ter sido feito.
MSALRetryCount Int 3 Esta definição controla quantas tentativas de repetição o fornecedor fará para um pedido individual de um token
MSALEnabledLogPII Bool Falso Esta definição controla se o registador anexado receberá dados PII da MSAL

Estas definições são partilhadas com todos os clientes que criam usando o Fornecedor de Autenticação MSAL. Estas definições destinam-se a ser lidas a partir de um leitor IConfiguration, numa secção de configuração denominada "MSALConfiguration".

Configuração MSAL é uma configuração opcional, se não definida ou fornecida, é utilizada a configuração predefinida para esses valores.

Aqui está um exemplo da entrada num fincheiro appsettings.json:

{
  "MSALConfiguration": {
    "MSALEnabledLogPII": "true",
    "MSALRequestTimeout": "00:00:40",
    "MSALRetryCount": "1"
  },
}

Nesse caso, esse bloco de definições instruiria todos os clientes MSAL criados com o forecedor MSAL a ativar o registro de PII, definir o tempo limite para 40 segundos e reduzir a contagem de repetições para 1.

Esta extensão procurará uma seção de configuração chamada "MSALConfiguration" no seu objeto IConfiguration e criará um objeto de configuração MSAL a partir dele.

Se a seção MSALConfig não for encontrada, ela criará o objeto de configuração do MSAL usando valores predefinidos.

    // Add default agent MsalAuth support
    builder.Services.AddDefaultMsalAuth(builder.Configuration);

    // Register your AgentApplication
    builder.AddAgent<MyAgent>();

Suporte de registo para autenticação

O sistema de autenticação MSAL permite o registo independente de fluxos de autenticação para integração de telemetria, caso precise resolver problemas de aquisição de tokens.

Para ativar o registo, adicionaria uma entrada para Microsoft.Agents.Authentication.Msal as definições da aplicação para configurar um ILogger para reportar operações de token para as suas ligações, caso tenha adicionado a opção MSALEnabledLogPII, isso também incluirá PII para a sua ligação.

Aqui está um exemplo do bloco de registo neste caso:

  "Logging": {
    "LogLevel": {
      "Default": "Warning",
      "Microsoft.Agents": "Warning",
      "Microsoft.Hosting.Lifetime": "Information",
      "Microsoft.Agents.Authentication.Msal": "Trace"
    }
  }

Nesse caso, o registo está ativado para vários módulos e incluem Microsoft.Agents.Authentication.Msal, onde o nível de rastreio é "Rastreio" para MSAL.