Tutorial: Criar uma conexão sem senha com um serviço de banco de dados por meio do Conector de Serviço

As conexões sem senha usam identidades gerenciadas para acessar os serviços do Azure. Com essa abordagem, você não precisa rastrear e gerenciar manualmente os segredos de identidades gerenciadas. O Azure lida com essas tarefas internamente com segurança.

O Service Connector permite identidades gerenciadas em serviços de hospedagem de aplicativos, como Aplicativos Spring do Azure e Serviço de Aplicativo do Azure. O Service Connector também configura serviços de banco de dados, como o Banco de Dados do Azure para PostgreSQL, o Banco de Dados do Azure para MySQL, o Banco de Dados SQL do Azure e o Banco de Dados SQL no Microsoft Fabric, para aceitar identidades gerenciadas.

Neste tutorial, você usa a CLI do Azure para concluir as seguintes tarefas:

  • Verificar seu ambiente inicial com a CLI do Azure.
  • Criar uma conexão sem senha com o Conector de Serviço.
  • Usar as variáveis de ambiente ou as configurações geradas pelo Conector de Serviço para acessar um serviço de banco de dados.

Pré-requisitos

Para começar a usar a CLI do Azure:

Instalar a extensão sem senha do Conector de Serviço

Instale a extensão sem senha do conector de serviço mais recente para a CLI do Azure:

az extension add --name serviceconnector-passwordless --upgrade

Observação

Verifique se a versão da serviceconnector-passwordless extensão é 2.0.2 ou posterior executando az version. Se necessário, atualize o CLI do Azure primeiro e atualize a extensão.

Criar a conexão sem senha

Os comandos a seguir usam Serviço de Aplicativo do Azure como exemplo para criar uma conexão usando uma identidade gerenciada.

Se você usar Aplicativos Spring do Azure, execute az spring connection create em vez disso. Para obter mais exemplos, confira Conectar os Aplicativos Spring do Azure ao banco de dados do Azure.

Observação

Se preferir o portal Azure, abra a folha Conector de Serviço em Serviço de Aplicativo do Azure ou Aplicativos Spring do Azure e selecione Criar. O portal compõe automaticamente o comando e o executa em Cloud Shell.

O comando da CLI do Azure a seguir usa um parâmetro --client-type, que pode ser java, dotnet, python etc. Execute o az webapp connection create postgres-flexible -h para obter os tipos de cliente com suporte e escolha aquele que corresponde ao seu aplicativo.

az webapp connection create postgres-flexible \
    --resource-group $RESOURCE_GROUP \
    --name $APPSERVICE_NAME \
    --target-resource-group $RESOURCE_GROUP \
    --server $POSTGRESQL_HOST \
    --database $DATABASE_NAME \
    --user-identity client-id=XX subs-id=XX \
    --client-type $CLIENT_TYPE

O Banco de dados do Azure para MySQL - Servidor Flexível exige uma identidade gerenciada atribuída pelo usuário para habilitar a autenticação do Microsoft Entra. Para obter mais informações, consulte Configurar a autenticação do Microsoft Entra para o Banco de Dados do Azure para MySQL - Servidor Flexível. Você pode usar o comando a seguir para criar uma identidade gerenciada atribuída pelo usuário:

USER_IDENTITY_NAME=<YOUR_USER_ASSIGNED_MANAGED_IDENTITY_NAME>
IDENTITY_RESOURCE_ID=$(az identity create \
    --name $USER_IDENTITY_NAME \
    --resource-group $RESOURCE_GROUP \
    --query id \
    --output tsv)

Importante

Após criar a identidade gerenciada atribuída pelo usuário, peça ao Administrador Global ou ao Administrador de Função com Privilégios para conceder as seguintes permissões para essa identidade:

  • User.Read.All
  • GroupMember.Read.All
  • Application.Read.All

Para obter mais informações, consulte a seção Permissões da autenticação do Active Directory.

Em seguida, conecte seu aplicativo a um banco de dados MySQL com uma identidade gerenciada atribuída pelo sistema usando o Conector de Serviço.

O comando da CLI do Azure a seguir usa um parâmetro --client-type. Execute o az webapp connection create mysql-flexible -h para obter os tipos de cliente com suporte e escolha aquele que corresponde ao seu aplicativo.

az webapp connection create mysql-flexible \
    --resource-group $RESOURCE_GROUP \
    --name $APPSERVICE_NAME \
    --target-resource-group $RESOURCE_GROUP \
    --server $MYSQL_HOST \
    --database $DATABASE_NAME \
    --user-identity client-id=XX subs-id=XX mysql-identity-id=$IDENTITY_RESOURCE_ID \
    --client-type java

O comando da CLI do Azure a seguir usa um parâmetro --client-type. Execute o az webapp connection create sql -h para obter os tipos de cliente com suporte e escolha aquele que corresponde ao seu aplicativo.

az webapp connection create sql \
    --resource-group $RESOURCE_GROUP \
    --name $APPSERVICE_NAME \
    --target-resource-group $RESOURCE_GROUP \
    --server $SQL_HOST \
    --database $DATABASE_NAME \
    --user-identity client-id=XX subs-id=XX \
    --client-type dotnet

O comando da CLI do Azure a seguir usa um parâmetro --client-type. Execute o az webapp connection create fabricsql -h para obter os tipos de cliente com suporte e escolha aquele que corresponde ao seu aplicativo.

Importante

Atualmente, o compartilhamento manual de acesso é necessário para integração completa. Consulte compartilhar acesso ao banco de dados SQL no Fabric.

az webapp connection create fabricsql \
    --resource-group $RESOURCE_GROUP \
    --name $APPSERVICE_NAME \
    --fabric-workspace-uuid $FABRIC_WORKSPACE_UUID \
    --fabric-sql-db-uuid $FABRIC_SQL_DB_UUID \
    --user-identity client-id=XX subs-id=XX \
    --client-type dotnet

Esse comando do Conector de Serviço executa as seguintes tarefas em segundo plano:

  • Habilite a Autenticação do Microsoft Entra para o servidor de banco de dados se ele não estiver habilitado antes.
  • Defina o administrador do Microsoft Entra como o usuário conectado atual.
  • Adicione um usuário de banco de dados para a identidade gerenciada atribuída pelo sistema, a identidade gerenciada atribuída pelo usuário ou a entidade de serviço. Conceda todos os privilégios do banco de dados $DATABASE_NAME a esse usuário. O nome de usuário pode ser encontrado na cadeia de conexão na saída do comando anterior.
  • Defina configurações nomeadasAZURE_MYSQL_CONNECTIONSTRING, AZURE_POSTGRESQL_CONNECTIONSTRINGou AZURE_SQL_CONNECTIONSTRINGFABRIC_SQL_CONNECTIONSTRINGpara o recurso do Azure com base no tipo de banco de dados.
    • Para o Serviço de Aplicativo, as configurações são definidas na folha Configurações do aplicativo.
    • Para os Aplicativos Spring, as configurações são definidas quando o aplicativo é iniciado.

O Conector do Serviço atribuirá os privilégios a seguir ao usuário, você poderá revogá-los e ajustar os privilégios de acordo com seus requisitos.

GRANT ALL PRIVILEGES ON DATABASE "$DATABASE_NAME" TO "username"; 

GRANT ALL PRIVILEGES ON ALL TABLES IN SCHEMA public TO "username"; 

GRANT ALL PRIVILEGES ON ALL SEQUENCES IN SCHEMA public TO "username"; 

GRANT ALL PRIVILEGES ON $DATABASE_NAME.* TO 'username'@'%'; 
GRANT CONTROL ON DATABASE::"$DATABASE_NAME" TO "username";
ALTER ROLE db_datareader ADD MEMBER "username"
ALTER ROLE db_datawriter ADD MEMBER "username"
ALTER ROLE db_ddladmin ADD MEMBER "username"

Conectar-se ao banco de dados com a autenticação do Microsoft Entra

Após criar a conexão, você pode utilizar a cadeia de conexão no seu aplicativo para conectar-se ao banco de dados com a autenticação do Microsoft Entra. Por exemplo, você pode utilizar as seguintes soluções para conectar-se ao banco de dados com a conectividade do Microsoft Entra.

Para o .NET, não existe um plug-in ou biblioteca que dê suporte a conexões sem senha. Você pode obter um token de acesso para a identidade gerenciada ou entidade de serviço usando a biblioteca de clientes como Azure.Identity. Em seguida, você pode utilizar o token de acesso como senha para se conectar ao banco de dados. Ao usar o código abaixo, remova a marca de comentário da parte do trecho de código referente ao tipo de autenticação que você quer usar.

using Azure.Identity;
using Azure.Core;
using Npgsql;

// Uncomment the following lines corresponding to the authentication type you want to use.
// For system-assigned identity.
// var sqlServerTokenProvider = new DefaultAzureCredential();

// For user-assigned identity.
// var sqlServerTokenProvider = new DefaultAzureCredential(
//     new DefaultAzureCredentialOptions
//     {
//         ManagedIdentityClientId = Environment.GetEnvironmentVariable("AZURE_POSTGRESQL_CLIENTID");
//     }
// );

// For service principal.
// var tenantId = Environment.GetEnvironmentVariable("AZURE_POSTGRESQL_TENANTID");
// var clientId = Environment.GetEnvironmentVariable("AZURE_POSTGRESQL_CLIENTID");
// var clientSecret = Environment.GetEnvironmentVariable("AZURE_POSTGRESQL_CLIENTSECRET");
// var sqlServerTokenProvider = new ClientSecretCredential(tenantId, clientId, clientSecret);

// Acquire the access token. 
AccessToken accessToken = await sqlServerTokenProvider.GetTokenAsync(
    new TokenRequestContext(scopes: new string[]
    {
        "https://ossrdbms-aad.database.windows.net/.default"
    }));

// Combine the token with the connection string from the environment variables provided by Service Connector.
string connectionString =
    $"{Environment.GetEnvironmentVariable("AZURE_POSTGRESQL_CONNECTIONSTRING")};Password={accessToken.Token}";

// Establish the connection.
using (var connection = new NpgsqlConnection(connectionString))
{
    Console.WriteLine("Opening connection using access token...");
    connection.Open();
}

Em seguida, se você criou tabelas e sequências no servidor flexível do PostgreSQL antes de usar o Service Connector, conecte-se como o proprietário e conceda permissão ao <aad-username> criado pelo Service Connector. O nome de usuário da cadeia de conexão ou da configuração definida pelo Conector de Serviço deve ser semelhante a aad_<connection name>. Se você usar o portal Azure, selecione o botão expandir ao lado da coluna Tipo de Serviço para obter o valor. Se você usar o CLI do Azure, verifique configurations na saída do comando da CLI.

Em seguida, execute a seguinte consulta para conceder permissões:

az extension add --name rdbms-connect

az postgres flexible-server execute -n <postgres-name> -u <owner-username> -p "<owner-password>" -d <database-name> --querytext "GRANT ALL PRIVILEGES ON ALL TABLES IN SCHEMA public TO \"<aad-username>\";GRANT ALL PRIVILEGES ON ALL SEQUENCES IN SCHEMA public TO \"<aad username>\";"

<owner-username> e <owner-password> pertencem ao proprietário da tabela existente, que pode conceder permissões a outros. O <aad-username> é o usuário criado pelo Conector de Serviço. Substitua-os por valores reais.

Valide o resultado:

az postgres flexible-server execute -n <postgres-name> -u <owner-username> -p "<owner-password>" -d <database-name> --querytext "SELECT distinct(table_name) FROM information_schema.table_privileges WHERE grantee='<aad-username>' AND table_schema='public';" --output table

Para o .NET, não existe um plug-in ou biblioteca que dê suporte a conexões sem senha. Você pode obter um token de acesso para a identidade gerenciada ou entidade de serviço usando a biblioteca de clientes como Azure.Identity. Em seguida, você pode utilizar o token de acesso como senha para se conectar ao banco de dados. Ao usar o código abaixo, remova a marca de comentário da parte do trecho de código referente ao tipo de autenticação que você quer usar.

using Azure.Core;
using Azure.Identity;
using MySqlConnector;

// Uncomment the following lines corresponding to the authentication type you want to use.
// For system-assigned managed identity.
// var credential = new DefaultAzureCredential();

// For user-assigned managed identity.
// var credential = new DefaultAzureCredential(
//     new DefaultAzureCredentialOptions
//     {
//         ManagedIdentityClientId = Environment.GetEnvironmentVariable("AZURE_MYSQL_CLIENTID");
//     });

// For service principal.
// var tenantId = Environment.GetEnvironmentVariable("AZURE_MYSQL_TENANTID");
// var clientId = Environment.GetEnvironmentVariable("AZURE_MYSQL_CLIENTID");
// var clientSecret = Environment.GetEnvironmentVariable("AZURE_MYSQL_CLIENTSECRET");
// var credential = new ClientSecretCredential(tenantId, clientId, clientSecret);

var tokenRequestContext = new TokenRequestContext(
    new[] { "https://ossrdbms-aad.database.windows.net/.default" });
AccessToken accessToken = await credential.GetTokenAsync(tokenRequestContext);
// Open a connection to the MySQL server using the access token.
string connectionString =
    $"{Environment.GetEnvironmentVariable("AZURE_MYSQL_CONNECTIONSTRING")};Password={accessToken.Token}";

using var connection = new MySqlConnection(connectionString);
Console.WriteLine("Opening connection using access token...");
await connection.OpenAsync();

// do something

Para obter mais amostras de código, confira Conectar-se aos bancos de dados do Azure a partir do Serviço de Aplicativo sem segredos usando uma identidade gerenciada.

  1. Instale as dependências.

    dotnet add package Microsoft.Data.SqlClient
    
  2. Obtenha a cadeia de conexão do Banco de Dados SQL do Azure da variável de ambiente adicionada pelo Conector do Serviço.

    using Microsoft.Data.SqlClient;
    
    string connectionString = 
        Environment.GetEnvironmentVariable("AZURE_SQL_CONNECTIONSTRING")!;
    
    using var connection = new SqlConnection(connectionString);
    connection.Open();
    

    Para obter mais informações, consulte Usando a autenticação de Identidade Gerenciada do Active Directory.

Para obter mais informações, confira Página inicial para a programação de cliente para interagir com o Microsoft SQL Server.

  1. Instale as dependências.

    dotnet add package Microsoft.Data.SqlClient
    
  2. Recupere a string de conexão do banco de dados SQL no Microsoft Fabric a partir da variável de ambiente adicionada pelo Service Connector.

    using Microsoft.Data.SqlClient;
    
    string connectionString = 
        Environment.GetEnvironmentVariable("FABRIC_SQL_CONNECTIONSTRING")!;
    
    using var connection = new SqlConnection(connectionString);
    connection.Open();
    

    Para obter mais informações, consulte Como usar a autenticação de identidade gerenciada do Active Directory.

Para obter mais informações, consulte Conectar-se ao banco de dados SQL no Microsoft Fabric.

Implantar o aplicativo em um serviço de hospedagem do Azure

  1. Implante seu aplicativo em um serviço de hospedagem do Azure. Opcionalmente, consulte os guias abaixo para obter mais informações sobre como implantar esses recursos.

  2. Verifique o log ou chame o aplicativo para ver se ele pode se conectar ao banco de dados do Azure com êxito.

Solução de problemas

Permissões

Se você se deparar com quaisquer erros relacionados a permissões, confirme o usuário da CLI do Azure conectado com o comando az account show. Certifique-se de entrar com a conta correta. A seguir, confirme que você tem as permissões a seguir que podem ser necessárias para criar uma conexão sem senha com o Conector de Serviço.

Permissão Operação
Microsoft.DBforPostgreSQL/flexibleServers/read Obrigatória para obter informações do servidor de banco de dados
Microsoft.DBforPostgreSQL/flexibleServers/write Necessário para habilitar a autenticação do Microsoft Entra com o servidor de banco de dados
Microsoft.DBforPostgreSQL/flexibleServers/firewallRules/write Obrigatória para criar uma regra de firewall para o caso de o endereço IP local ser bloqueado
Microsoft.DBforPostgreSQL/flexibleServers/firewallRules/delete Obrigatória para reverter a regra de firewall criada pelo Conector de Serviço para evitar um problema de segurança
Microsoft.DBforPostgreSQL/flexibleServers/administrators/read Necessário para verificar se o usuário de logon da CLI do Azure é um administrador do Microsoft Entra do servidor de banco de dados
Microsoft.DBforPostgreSQL/flexibleServers/administrators/write Exigido para adicionar o usuário de logon da CLI do Azure como administrador do Microsoft Entra do servidor de banco de dados
Permissão Operação
Microsoft.DBforMySQL/flexibleServers/read Obrigatória para obter informações do servidor de banco de dados
Microsoft.DBforMySQL/flexibleServers/write Obrigatória para adicionar a identidade gerenciada atribuída pelo usuário fornecida ao servidor de banco de dados
Microsoft.DBforMySQL/flexibleServers/firewallRules/write Obrigatória para criar uma regra de firewall para o caso de o endereço IP local ser bloqueado
Microsoft.DBforMySQL/flexibleServers/firewallRules/delete Obrigatória para reverter a regra de firewall criada pelo Conector de Serviço para evitar um problema de segurança
Microsoft.DBforMySQL/flexibleServers/administrators/read Necessário para verificar se o usuário de logon da CLI do Azure é um administrador do Microsoft Entra do servidor de banco de dados
Microsoft.DBforMySQL/flexibleServers/administrators/write Exigido para adicionar o usuário de logon da CLI do Azure como administrador do Microsoft Entra do servidor de banco de dados
Permissão Operação
Microsoft.Sql/servers/read Obrigatória para obter informações do servidor de banco de dados
Microsoft.Sql/servers/firewallRules/write Obrigatória para criar uma regra de firewall para o caso de o endereço IP local ser bloqueado
Microsoft.Sql/servers/firewallRules/delete Obrigatória para reverter a regra de firewall criada pelo Conector de Serviço para evitar um problema de segurança
Microsoft.Sql/servers/administrators/read Necessário para verificar se o usuário de logon da CLI do Azure é um administrador do Microsoft Entra do servidor de banco de dados
Microsoft.Sql/servers/administrators/write Exigido para adicionar o usuário de logon da CLI do Azure como administrador do Microsoft Entra do servidor de banco de dados

Em alguns casos, as permissões não são obrigatórias. Por exemplo, se o usuário autenticado pela CLI do Azure já for um Administrador do Active Directory no SQL Server, você não precisará ter a permissão de Microsoft.Sql/servers/administrators/write.

Microsoft Entra ID

Se você receber um erro ERROR: AADSTS530003: Your device is required to be managed to access this resource., peça ajuda ao seu departamento de TI para ingressar esse dispositivo no Microsoft Entra ID. Para obter mais informações, consulte Dispositivos ingressados no Microsoft Entra.

O Conector de Serviço precisa acessar o Microsoft Entra ID para obter informações da sua conta Microsoft e a identidade gerenciada do serviço de hospedagem. Você pode usar o seguinte comando para verificar se seu dispositivo pode acessar o Microsoft Entra ID:

az ad signed-in-user show

Se não fizer o login interativamente, você também poderá receber o erro e Interactive authentication is needed. Para resolver o erro, faça login com o comando az login.

Conectividade de rede

Se o seu servidor de banco de dados estiver em uma Rede Virtual, certifique-se de que o seu ambiente que executa o comando da CLI do Azure possa acessar o servidor no Rede Virtual.

Se o seu servidor de banco de dados estiver em uma Rede Virtual, certifique-se de que o seu ambiente que executa o comando da CLI do Azure possa acessar o servidor no Rede Virtual.

Se o seu servidor de banco de dados não permitir o acesso público, certifique-se de que o seu ambiente que executa o comando da CLI do Azure possa acessar o servidor por meio do ponto de extremidade privado.

Próximas etapas

Para obter mais informações sobre o Service Connector e conexões sem senha, consulte os seguintes recursos: