Logons e usuários do Microsoft Entra com nomes de exibição que não são exclusivos (preview)

Aplica-se a: Banco de Dados SQL do Azure Instância Gerenciada de SQL do Azure

Este artigo ensina como usar a sintaxe Object_ID do T-SQL para criar logons e usuários do Microsoft Entra com nomes de exibição não exclusivos no Banco de Dados SQL do Azure e na Instância Gerenciada de SQL do Azure.

Observação

O uso de WITH OBJECT_ID para criar usuários e logons no SQL do Azure está atualmente em versão preview.

Visão geral

O Microsoft Entra ID oferece suporte à autenticação para entidades de serviço. No entanto, usar uma entidade de serviço com um nome de exibição que não é exclusivo no Microsoft Entra ID conduz a erros durante a criação do logon ou do usuário no SQL do Azure.

Por exemplo, se o aplicativo myapp não for exclusivo, você poderá se deparar com o seguinte erro:

Msg 33131, Level 16, State 1, Line 4 
Principal 'myapp' has a duplicate display name. Make the display name unique in Azure Active Directory and execute this statement again. 

Ao tentar executar a seguinte instrução T-SQL:

CREATE LOGIN [myapp] FROM EXTERNAL PROVIDER 

A extensão WITH OBJECT_ID

O erro de nome de exibição duplicado ocorre porque o Microsoft Entra ID permite nomes de exibição duplicados para o aplicativo do Microsoft Entra (entidade de serviço), enquanto o SQL do Azure requer nomes exclusivos para a criação de logons e de usuários do Microsoft Entra. Para realizar a mitigação desse problema, a instrução de linguagem de definição de dados (DDL) para a criação de logons e de usuários foi ampliada para incluir o ID de objeto do recurso Azure com a cláusula WITH OBJECT_ID.

Observação

A extensão WITH OBJECT_ID está no momento em versão prévia pública.

A maioria dos nomes de exibição que não são exclusivos no Microsoft Entra ID está relacionada a entidades de serviço, embora ocasionalmente os nomes de grupos também possam não ser exclusivos. Os nomes principais de segurança do Microsoft Entra são exclusivos, pois dois usuários não podem ter uma entidade de usuário semelhante. No entanto, um registro de aplicativo (entidade de serviço) pode ser criado com um nome de exibição igual ao nome principal de segurança.

Se o nome de exibição da entidade de serviço não for duplicado, a instrução padrão CREATE LOGIN ou CREATE USER deverá ser usada. A extensão WITH OBJECT_ID está em visualização pública e é um item de reparo de solução de problemas implementado para o uso com entidades de serviço que não são exclusivas. Não é recomendado usá-lo com uma entidade de serviço exclusiva. Usar a extensão WITH OBJECT_ID para uma entidade de serviço sem adicionar um sufixo será uma ação executada com êxito, mas não será óbvio para qual entidade de serviço o logon ou o usuário foi criado. É recomendável criar um alias ao usar um sufixo para identificar exclusivamente a entidade de serviço. A extensão WITH OBJECT_ID não oferece suporte para SQL Server.

T-SQL cria sintaxe de logon e de usuário para nomes de exibição que não são exclusivos

CREATE LOGIN [login_name] FROM EXTERNAL PROVIDER 
  WITH OBJECT_ID = 'objectid'
CREATE USER [user_name] FROM EXTERNAL PROVIDER 
  WITH OBJECT_ID = 'objectid'

Com a extensão de capacidade de suporte a DDL em T-SQL para criar logons ou usuários com o ID de objeto, é possível evitar o erro 33131 e também especificar um alias para o logon ou usuário criado com o ID de objeto. Por exemplo, o conteúdo apresentado a seguir criará um logon myapp4466e ao usar o ID de objeto do aplicativo 4466e2f8-0fea-4c61-a470-xxxxxxxxxxxx.

CREATE LOGIN [myapp4466e] FROM EXTERNAL PROVIDER 
  WITH OBJECT_ID = '4466e2f8-0fea-4c61-a470-xxxxxxxxxxxx' 
  • Para executar a consulta acima, o ID de objeto especificado deve existir no locatário do Microsoft Entra em que o recurso SQL do Azure reside. Caso contrário, o comando CREATE falhará e você receberá a mensagem de erro: Msg 37545, Level 16, State 1, Line 1 '' is not a valid object id for '' or you do not have permission.
  • O logon ou o nome de usuário deve conter o nome da entidade de serviço original ampliado por um sufixo definido pelo usuário ao usar a instrução CREATE LOGIN ou CREATE USER. Como melhor prática, o sufixo pode incluir uma parte inicial do ID de objeto. Por exemplo, myapp2ba6c para o ID de objeto 2ba6c0a3-cda4-4878-a5ca-xxxxxxxxxxxx. No entanto, também é possível definir um sufixo personalizado. Não é necessário formar o sufixo usando o ID de objeto.

Essa convenção de nomenclatura é recomendada para associar explicitamente o usuário do banco de dados ou fazer logon novamente em seu objeto no Microsoft Entra ID.

Observação

O alias respeita a especificação T-SQL para sysname, incluindo um tamanho máximo de 128 caracteres. Recomendamos limitar o sufixo aos primeiros cinco caracteres do ID de objeto.

O nome de exibição da entidade de serviço no Microsoft Entra ID não está sincronizado com o logon do banco de dados ou com o alias do usuário. A execução de CREATE LOGIN ou de CREATE USER não afetará o nome de exibição no Portal do Azure. De forma semelhante, a modificação do nome de exibição do Microsoft Entra ID não afetará o logon do banco de dados ou o alias do usuário.

Identificação do usuário criado para o aplicativo

Para entidades de serviço que não são exclusivas, é importante verificar se o alias do Microsoft Entra está vinculado ao aplicativo correto. Para verificar se o usuário foi criado para a entidade de serviço (aplicativo) correta:

  1. Obtenha o ID do aplicativo para o aplicativo ou o ID de objeto do grupo do Microsoft Entra do usuário criado no Banco de Dados SQL. Veja as seguintes consultas:

    • Para obter o ID do aplicativo da entidade de serviço do usuário criado, execute a seguinte consulta:

      SELECT CAST(sid as uniqueidentifier) ApplicationID, create_date FROM sys.server_principals WHERE NAME = 'myapp2ba6c' 
      

      Exemplo de saída:

      Captura de tela da saída do SSMS para a ID do aplicativo.

      O ID do aplicativo é convertido do número de identificação de segurança (SID) para o logon ou para o nome de usuário especificado, que podemos confirmar com a execução da consulta abaixo e com a comparação dos últimos dígitos e das datas criadas:

      SELECT SID, create_date FROM sys.server_principals WHERE NAME = 'myapp2ba6c' 
      

      Exemplo de saída:

      Captura de tela da saída do SSMS para o SID do aplicativo.

    • Para obter o ID de objeto do grupo do Microsoft Entra do usuário criado, execute a seguinte consulta:

      SELECT CAST(sid as uniqueidentifier) ObjectID, createdate FROM sys.sysusers WHERE NAME = 'myappgroupd3451b' 
      

      Exemplo de saída:

      Captura de tela da saída do SSMS para a ID de Objeto do grupo do Microsoft Entra.

      Para verificar o SID do grupo do Microsoft Entra do usuário criado, execute a seguinte consulta:

      SELECT SID, createdate FROM sys.sysusers WHERE NAME = 'myappgroupd3451b' 
      

      Exemplo de saída:

      Captura de tela da saída do SSMS para o SID do grupo.

    • Para obter o ID de objeto e o ID do aplicativo para o aplicativo ao usar o PowerShell, execute o seguinte comando:

      Get-AzADApplication -DisplayName "myapp2ba6c"
      
  2. Acesse o Portal do Azure e, em seu Aplicativo Empresarial ou recurso de grupo do Microsoft Entra, verifique o ID do Aplicativo ou o ID de Objeto, respectivamente. Veja se corresponde ao obtido na consulta acima.

Observação

Ao criar um usuário de uma entidade de serviço, o ID de objeto é necessário ao usar a cláusula WITH OBJECT_ID com a instrução T-SQL CREATE. Isso é diferente do ID do aplicativo que é retornado quando você tenta verificar o alias no SQL do Azure. Ao usar esse processo de verificação, é possível identificar a entidade de serviço ou o grupo associado ao alias SQL no Microsoft Entra ID e evitar possíveis erros ao criar logons ou usuários com um ID de objeto.

Localização do ID de objeto correto

Para obter informações sobre o ID de objeto de uma entidade de serviço, confira Objeto de entidade de serviço. É possível localizar o ID de objeto da entidade de serviço listada ao lado do nome do aplicativo no Portal do Azure em Aplicativos Empresariais.

Aviso

O ID de objeto obtido na página de Visão Geral do Registro de Aplicativo é diferente do ID de objeto obtido na página de Visão Geral dos Aplicativos Empresariais. Se você estiver na página de Visão Geral do Registro de Aplicativo, selecione o aplicativo gerenciado do diretório local vinculado no nome do aplicativo para navegar até o ID de objeto correto na página de Visão Geral dos Aplicativos Empresariais.