Configurar autenticação num 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-lhe criar e usar múltiplos clientes distintos com o motor de alojamento Agents Framework. Com o fornecedor de autenticação MSAL, pode fornecer múltiplas configurações de ligação no ficheiro de configuração da aplicação. Cada configuração de ligação pode ser usada para criar um cliente de autenticação nomeado para suportar comunicações com serviços externos ou outros agentes.

As secções seguintes descrevem as definições de configuração obrigatórias e opcionais para cada um dos tipos de autenticação suportados pelo fornecedor de autenticação MSAL, juntamente com exemplos de excertos de configuração para cada tipo.

Inquilino único com ClientSecret

Nome da configuração Tipo Valor padrão Description
ID do Cliente Corda 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 Corda Nulo Quando presente, é utilizado como Autoridade para solicitar um token.
Id de Inquilino Corda 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 configurações de aplicação para inquilino único* ClientSecret:

  "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 configuração Tipo Valor padrão Description
ID do Cliente Corda 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 Corda Nulo Quando presente, é utilizado como Autoridade para solicitar um token.
Id de Inquilino Corda 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-inquilino com ClientSecret:

  "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 configuração Tipo Valor padrão Description
ID do Cliente Corda Nulo ClientId da Identidade Gerida para usar ao criar o token de acesso.

Observação

Ao usar os tipos de identidade geridos, o seu host ou cliente deve estar a executar um serviço do Azure e ter configurado esse serviço com uma identidade gerida designada pelo sistema (System-Assigned Managed identity) ou uma identidade gerida designada pelo utilizador (User-Assigned Managed identity).

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 SystemManagedIdentityde autenticação , o ID do cliente é ignorado e a identidade gerida pelo sistema para o serviço é utilizada.

Observação

Ao utilizar tipos de identidade gerida, o host ou cliente deve estar a operar com um serviço da Azure e ter esse serviço configurado com uma identidade gerida atribuída pelo sistema (System-Assigned) ou uma identidade gerida atribuída pelo usuário (User-Assigned).

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 configuração Tipo Valor padrão Description
ID do Cliente Corda Nulo ClientId (AppId) para usar ao criar o token de acesso.
AuthorityEndpoint Corda Nulo Quando presente, é utilizado como Autoridade para solicitar um token.
Id de Inquilino Corda 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 Corda 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 configuração Tipo Valor padrão Description
ID do Cliente Corda Nulo ClientId (AppId) para usar ao criar o token de acesso.
AuthorityEndpoint Corda Nulo Quando presente, é utilizado como Autoridade para solicitar um token.
Id de Inquilino Corda 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 Corda Nulo O ficheiro de token (o mesmo que AKS AZURE_FEDERATED_TOKEN_FILE env var)

Aqui está um exemplo de configurações de aplicação para inquilino único WorkloadIdentity:

  "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 configuração Tipo Valor padrão Description
ID do Cliente Corda Nulo ID do cliente para o qual uma asserção assinada é solicitada
TokenEndpoint Corda Nulo O ponto final de token pretendido
Claims Corda 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 Description
AuthorityEndpoint Corda Nulo Quando presente, é utilizado como Autoridade para solicitar um token.
Id de Inquilino Corda 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 Corda Nulo ClientId (AppId) para usar ao criar o token de acesso.
CertSubjectName Corda Nulo Quando AuthType é CertificateSubjectName, este é o nome do assunto que é procurado
CertStoreName Corda "Meu" Quando AuthType é CertificateSubjectName ou Certificate, indica em que armazenamento de certificados procurar
ValidCertificateOnly bool Verdadeiro Requer que o certificado tenha uma cadeia válida.
SendX5C bool Falso Permite a rotação automática de certificados com a configuração apropriada.

Aqui está um exemplo de appsettings para CertificateSubjectName para o Nome do Assunto e Emissor (SNI) e multi-inquilino

  "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"
        ]
      }
    }
  },

Certificate

Tipo de Autenticação Tipo Valor padrão Description
AuthorityEndpoint Corda Nulo Quando presente, é utilizado como Autoridade para solicitar um token.
Id de Inquilino Corda 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 Corda Nulo ClientId (AppId) para usar ao criar o token de acesso.
CertThumbprint Corda Nulo Thumbprint do certificado a carregar, válida apenas quando AuthType é definido como Certificado
CertStoreName Corda "Meu" Quando AuthType é CertificateSubjectName ou Certificate, indica em que armazenamento de certificados procurar
ValidCertificateOnly bool Verdadeiro Requer que o certificado tenha uma cadeia válida.
SendX5C bool 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 configuração Tipo Valor padrão Description
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".

Observação

MSALConfiguration é uma configuração opcional. Se não definires esta configuração, usam-se as configurações padrão 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 dos fluxos de autenticação para integração de telemetria, caso precise de resolver problemas na 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.