Tutorial: Conectar-se ao Banco de Dados SQL do Serviço de Aplicativo .NET sem segredos usando uma identidade gerenciada

O Serviço de Aplicativo fornece um serviço de hospedagem na Web altamente escalonável e com aplicação automática de patches no Azure. Ele também fornece uma identidade gerenciada para seu aplicativo, que é uma solução perfeita para proteger o acesso ao Banco de Dados SQL do Azure e a outros serviços do Azure. As identidades gerenciadas no Serviço de Aplicativo tornam seu aplicativo mais seguro, eliminando os segredos do aplicativo, como as credenciais nas cadeias de conexão. Neste tutorial, você adiciona a identidade gerenciada ao aplicativo Web de exemplo criado em um dos seguintes tutoriais:

Quando você terminar, seu aplicativo de exemplo se conectará ao Banco de Dados SQL com segurança sem a necessidade de nomes de usuário e senhas.

Diagrama de arquitetura para o cenário do tutorial.

Observação

As etapas abordadas neste tutorial são compatíveis com as versões a seguir:

  • .NET Framework 4.8 e posteriores
  • .NET 6.0 e posteriores

Para obter diretrizes sobre Banco de Dados do Azure para MySQL ou Banco de Dados do Azure para PostgreSQL em outras estruturas de linguagem (Node.js, Python e Java), confira Tutorial: conectar-se aos bancos de dados do Azure do Serviço de Aplicativo sem segredos usando uma identidade gerenciada.

O que você aprenderá:

  • Habilitar identidades gerenciadas
  • Conceder ao Banco de Dados SQL acesso à identidade gerenciada
  • Configurar o Entity Framework para usar a autenticação do Microsoft Entra com o Banco de Dados SQL
  • Conectar-se ao Banco de Dados SQL do Visual Studio usando a autenticação do Microsoft Entra

Observação

A autenticação do Microsoft Entra é diferente da autenticação integrada do Windows no Active Directory (AD DS) local. O AD DS e o Microsoft Entra ID usam protocolos de autenticação completamente diferentes. Para saber mais, confira Sincronização com escopo do Microsoft Entra Domain Services.

Caso você não tenha uma assinatura do Azure, crie uma conta gratuita do Azure antes de começar.

Pré-requisitos

Este artigo continua de onde você parou em qualquer um dos seguintes tutoriais:

Caso ainda não o tenha feito, primeiro siga um dos dois tutoriais. Como alternativa, você pode adaptar as etapas ao seu próprio aplicativo .NET com o Banco de Dados SQL.

Para depurar seu aplicativo usando o banco de dados SQL como back-end, verifique se você permitiu a conexão do cliente no seu computador. Caso contrário, adicione o IP do cliente seguindo as etapas descritas em Gerenciar regras de firewall de IP no nível do servidor usando o portal do Azure.

Prepare seu ambiente para a CLI do Azure.

1. Conceder acesso de banco de dados ao usuário do Microsoft Entra

Primeiro, habilite a autenticação do Microsoft Entra no Banco de Dados SQL, atribuindo um usuário do Microsoft Entra como o administrador do servidor. Esse usuário é diferente da conta Microsoft usada para inscrição na assinatura do Azure. Esse usuário precisa ser criado, importado, sincronizado ou convidado por você para o Microsoft Entra ID. Para obter mais informações sobre os usuários permitidos do Microsoft Entra, consulte os Recursos e limitações do Microsoft Entra no Banco de Dados SQL.

  1. Se o locatário do Microsoft Entra ainda não tiver um usuário, crie um seguindo as etapas em Adicionar ou excluir usuários usando o Microsoft Entra ID.

  2. Localize a ID do objeto do usuário do Microsoft Entra usando a az ad user list e substitua <user-principal-name>. O resultado é salvo em uma variável.

    $azureaduser=(az ad user list --filter "userPrincipalName eq '<user-principal-name>'" --query '[].id' --output tsv)
    

    Dica

    Para visualizar a lista de todos os nomes de entidade de segurança do usuário no Microsoft Entra ID, execute az ad user list --query '[].userPrincipalName'.

  3. Adicione o usuário do Microsoft Entra como um administrador do Active Directory usando o comando az sql server ad-admin create no Cloud Shell. No comando a seguir, substitua <server-name> pelo nome do servidor do Banco de Dados SQL (sem o sufixo .database.windows.net).

    az sql server ad-admin create --resource-group myResourceGroup --server-name <server-name> --display-name ADMIN --object-id $azureaduser
    

Para obter mais informações sobre como adicionar um administrador do Active Directory, confira Provisionar um administrador do Microsoft Entra para o servidor

2. Configurar o ambiente de desenvolvimento

  1. O Visual Studio para Windows é integrado à autenticação do Microsoft Entra. Para habilitar o desenvolvimento e a depuração no Visual Studio, adicione seu usuário do Microsoft Entra no Visual Studio selecionando Arquivo>Configurações de Conta no menu e, a seguir, selecione Entrar ou Adicionar.

  2. Para configurar o usuário do Microsoft Entra para a autenticação do serviço do Azure, selecione Ferramentas>Opções no menu e, em seguida, selecione Autenticação do Serviço do Azure>Seleção de Conta. Selecione o usuário do Microsoft Entra que você adicionou e selecione OK.

Para obter mais informações sobre como configurar seu ambiente de desenvolvimento para a autenticação do Microsoft Entra, confira Biblioteca de clientes da Identidade do Azure para .NET.

Agora você já pode desenvolver e depurar seu aplicativo tendo o banco de dados SQL como back-end, usando a autenticação do Microsoft Entra.

3. Modificar o seu projeto

Observação

Não é mais recomendável usar o Microsoft.Azure.Services.AppAuthentication com o novo SDK do Azure. Ele é substituído pela nova biblioteca de clientes de Identidade do Azure disponível para .NET, Java, TypeScript e Python e deve ser usado para todo o novo desenvolvimento. Informações sobre como fazer a migração para o Azure Identity podem ser encontradas aqui: Azure Identity.

As etapas a seguir para o seu projeto dependem do uso do Entity Framework Core (padrão para ASP.NET Core) ou do Entity Framework (padrão para ASP.NET).

  1. No Visual Studio, abra o Console do Gerenciador de Pacotes e adicione o pacote NuGet Microsoft.Data.SqlClient:

    Install-Package Microsoft.Data.SqlClient -Version 5.1.0
    
  2. No tutorial do ASP.NET Core e Banco de Dados SQL, a cadeia de conexão MyDbConnection em appsettings.json ainda não é usada. O ambiente local e o ambiente do Azure obtêm cadeias de conexão das respectivas variáveis de ambiente para manter os segredos de conexão fora do arquivo de origem. Mas agora, com a autenticação do Active Directory, não há mais segredos. Em appsettings.json, substitua o valor da cadeia de conexão MyDbConnection por:

    "Server=tcp:<server-name>.database.windows.net;Authentication=Active Directory Default; Database=<database-name>;"
    

    Observação

    O tipo de autenticação Padrão do Active Directory pode ser usado no computador local e no Serviço de Aplicativo do Azure. O driver tenta adquirir um token do Microsoft Entra ID usando diversos meios. Se a aplicação for implementada, obtém um token da identidade gerida atribuída pelo sistema da aplicação. Também pode autenticar com uma identidade gerida atribuída pelo utilizador se incluir: User Id=<client-id-of-user-assigned-managed-identity>; na sua cadeia de ligação. Se o aplicativo estiver em execução localmente, ele tentará obter um token do Visual Studio, do Visual Studio Code e da CLI do Azure.

    Isso é tudo de que você precisa para se conectar ao Banco de Dados SQL. Quando você depura no Visual Studio, seu código usa o usuário do Microsoft Entra configurado em 2. Configurar seu ambiente de desenvolvimento. Você vai configurar o Banco de Dados SQL posteriormente para permitir a conexão na identidade gerenciada do aplicativo do Serviço de Aplicativo. A classe DefaultAzureCredential armazena em cache o token que está na memória e o recupera do Microsoft Entra ID logo antes da expiração. Você não precisa de nenhum código personalizado para atualizar o token.

  3. Digite Ctrl+F5 para executar o aplicativo novamente. Agora, o mesmo aplicativo CRUD no seu navegador está se conectando diretamente ao Banco de Dados SQL do Azure, usando a autenticação do Microsoft Entra. Essa configuração permite que você execute migrações de banco de dados do Visual Studio.

4. Usar conectividade de identidade gerenciada

Em seguida, você pode configurar o aplicativo de seu Serviço de Aplicativo para conexão com o banco de dados SQL com uma identidade gerenciada atribuída ao sistema.

Observação

Embora as instruções desta seção se destinem a uma identidade atribuída ao sistema, uma identidade atribuída ao usuário pode ser usada com a mesma facilidade. Para fazer isso, você precisará alterar o az webapp identity assign command para atribuir a identidade atribuída ao usuário desejada. Em seguida, ao criar o usuário do SQL, lembre-se de usar o nome do recurso de identidade atribuída ao usuário em vez do nome do site.

Habilitar a identidade gerenciada no aplicativo

Para habilitar uma identidade gerenciada para o aplicativo do Azure, use o comando az webapp identity assign no Cloud Shell. No comando a seguir, substitua <app-name>.

az webapp identity assign --resource-group myResourceGroup --name <app-name>

Observação

Para habilitar a identidade gerenciada para um slot de implantação, adicione --slot <slot-name> e use o nome do slot em <slot-name>.

Veja um exemplo da saída:

{
  "additionalProperties": {},
  "principalId": "21dfa71c-9e6f-4d17-9e90-1d28801c9735",
  "tenantId": "72f988bf-86f1-41af-91ab-2d7cd011db47",
  "type": "SystemAssigned"
}

Conceder permissões para a identidade gerenciada

Observação

Se quiser, você pode adicionar a identidade a um grupo do Microsoft Entra e, a seguir, conceder acesso ao Banco de Dados SQL ao grupo do Microsoft Entra, no lugar da identidade. Por exemplo, os comandos a seguir adicionam a identidade gerenciada da etapa anterior a um novo grupo chamado myAzureSQLDBAccessGroup:

$groupid=(az ad group create --display-name myAzureSQLDBAccessGroup --mail-nickname myAzureSQLDBAccessGroup --query objectId --output tsv)
$msiobjectid=(az webapp identity show --resource-group myResourceGroup --name <app-name> --query principalId --output tsv)
az ad group member add --group $groupid --member-id $msiobjectid
az ad group member list -g $groupid
  1. No Cloud Shell, entre no Banco de Dados SQL usando o comando SQLCMD. Substitua o <server-name> pelo nome do seu servidor, o <db-name> pelo nome do banco de dados usado por seu aplicativo e o <aad-user-name> e <aad-password> pelas credenciais do seu usuário do Microsoft Entra.

    sqlcmd -S <server-name>.database.windows.net -d <db-name> -U <aad-user-name> -P "<aad-password>" -G -l 30
    
  2. No prompt do SQL do banco de dados desejado, execute os comandos a seguir para conceder as permissões mínimas necessárias ao seu aplicativo. Por exemplo,

    CREATE USER [<identity-name>] FROM EXTERNAL PROVIDER;
    ALTER ROLE db_datareader ADD MEMBER [<identity-name>];
    ALTER ROLE db_datawriter ADD MEMBER [<identity-name>];
    ALTER ROLE db_ddladmin ADD MEMBER [<identity-name>];
    GO
    

    O <identity-name> é o nome da identidade gerenciada no Microsoft Entra ID. Se a identidade for atribuída ao sistema, o nome será sempre igual ao nome do aplicativo do Serviço de Aplicativo. Para um slot de implantação, o nome da identidade atribuída ao sistema dele é <app-name>/slots/<slot-name>. Para conceder permissões para um grupo do Microsoft Entra, use alternativamente o nome de exibição do grupo (por exemplo, myAzureSQLDBAccessGroup).

  3. Digite EXIT para retornar ao prompt do Cloud Shell.

    Observação

    Os serviços de back-end das identidades gerenciadas também mantêm um cache de token que atualiza o token para um recurso de destino somente quando ele expira. Se você cometer um erro ao configurar as permissões do Banco de Dados SQL e tentar modificar as permissões depois de tentar obter um token com o seu aplicativo, você não obterá um novo token com as permissões atualizadas até que o token armazenado em cache expire.

    Observação

    O Microsoft Entra ID e as identidades gerenciadas não são compatíveis com o SQL Server local.

Modificar cadeia de conexão

Lembre-se de que as mesmas alterações feitas em Web.config ou appsettings.json funcionam com a identidade gerenciada, portanto, o que resta fazer é remover a cadeia de conexão existente no Serviço de Aplicativo, criada pela Visual Studio ao implantar seu aplicativo pela primeira vez. Use o comando a seguir, mas substitua <app-name> pelo nome de seu aplicativo.

az webapp config connection-string delete --resource-group myResourceGroup --name <app-name> --setting-names MyDbConnection

5. Publicar suas alterações

Agora, só falta publicar suas alterações no Azure.

  1. Se você veio do Tutorial: Criar um aplicativo ASP.NET no Azure com o Banco de Dados SQL , publique suas alterações no Visual Studio. No Gerenciador de Soluções, clique com botão direito no projeto DotNetAppSqlD e selecione Publicar.

    Publicar no Gerenciador de Soluções

  2. Na página de publicação, selecione Publicar.

    Importante

    Verifique se o nome do serviço de aplicativo não corresponde a nenhum Registro de Aplicativo existente. Isso resultará em conflitos de ID da Entidade de Segurança.

Quando a nova página da Web mostra a lista de tarefas pendentes, seu aplicativo se conecta ao banco de dados usando a identidade gerenciada.

Aplicativo do Azure após Migração do Code First

Agora, você pode editar a lista de tarefas pendentes como fazia antes.

Limpar os recursos

Nas etapas anteriores, você criou os recursos do Azure em um grupo de recursos. Se você acha que não precisará desses recursos no futuro, exclua o grupo de recursos executando o seguinte comando no Cloud Shell:

az group delete --name myResourceGroup

Esse comando pode demorar um pouco para ser executado.

Próximas etapas

O que você aprendeu:

  • Habilitar identidades gerenciadas
  • Conceder ao Banco de Dados SQL acesso à identidade gerenciada
  • Configurar o Entity Framework para usar a autenticação do Microsoft Entra com o Banco de Dados SQL
  • Conectar-se ao Banco de Dados SQL do Visual Studio usando a autenticação do Microsoft Entra