Självstudie: Skapa Microsoft Entra-användare med hjälp av Microsoft Entra-program

Gäller för:Azure SQL Database

Den här artikeln beskriver hur du konfigurerar ett huvudnamn för tjänsten så att den kan skapa Microsoft Entra-användare i Azure SQL Database. Den här funktionen möjliggör programmatisk konfiguration av åtkomsthantering till Azure SQL-resurser för användare och program i din Microsoft Entra-klientorganisation.

Kommentar

Microsoft Entra-ID är det nya namnet för Azure Active Directory (Azure AD). Vi uppdaterar dokumentationen just nu.

Mer information om Microsoft Entra-autentisering för Azure SQL finns i artikeln Använda Microsoft Entra-autentisering.

I den här självstudien lär du dig att:

  • Tilldela en identitet till den logiska servern
  • Tilldela rollen Katalogläsare till serveridentiteten
  • Registrera ett program i Microsoft Entra-ID
  • Skapa en databasanvändare för programmets tjänsthuvudnamn i Azure SQL Database
  • Skapa en Microsoft Entra-databasanvändare med tjänstens huvudnamn

Förutsättningar

  • En befintlig Azure SQL Database-distribution . Vi antar att du har en fungerande SQL Database för den här självstudien.
  • Microsoft Entra Global Administrator eller Privileged Role Administrator behörigheter i klientorganisationen där SQL-databasen finns.
  • Den senaste versionen av Az.Sql PowerShell-modulen.
  • Den senaste versionen av Microsoft.Graph PowerShell-modulen.

Tilldela en identitet till den logiska servern

  1. Anslut till Azure och ange den Microsoft Entra-klientorganisation som är värd för din SQL-databas. Klientorganisations-ID:t finns på sidan Översikt för din Microsoft Entra-ID-resurs i Azure-portalen. Kopiera klientorganisations-ID:t och kör sedan följande PowerShell-kommando:

    • Ersätt <TenantId> med ditt klientorganisations-ID.
    Connect-AzAccount -Tenant <TenantId>
    

    TenantId Registrera för framtida användning i den här självstudien.

  2. Generera en systemtilldelad hanterad identitet och tilldela den till den logiska servern i Azure. Kör följande PowerShell-kommando:

    • Ersätt <ResourceGroupName> och <ServerName> med dina resurser i kommandot Set-AzSqlServer . Om servernamnet är myserver.database.windows.netersätter du <ServerName> med myserver.
    Set-AzSqlServer -ResourceGroupName <ResourceGroupName> -ServerName <ServerName> -AssignIdentity
    
  3. Kontrollera att serveridentiteten har tilldelats. Kör följande PowerShell-kommando:

    • Ersätt <ResourceGroupName> och <ServerName> med dina resurser. Om servernamnet är myserver.database.windows.netersätter du <ServerName> med myserver.
    $xyz = Get-AzSqlServer -ResourceGroupName <ResourceGroupName> -ServerName <ServerName>
    $xyz.identity
    

    Dina utdata bör visa dig PrincipalId, Typeoch TenantId. Den tilldelade identiteten PrincipalIdär .

  4. Du kan också kontrollera identiteten genom att gå till Azure-portalen.

    • Gå till Företagsprogram i Microsoft Entra-ID-resursen. Ange namnet på den logiska servern. Objekt-ID :t som visas på resursen är ID för den primära serveridentiteten.

    Screenshot shows where to find the Object ID for an enterprise application.

Lägga till serveridentitet i katalogläsarrollen

Serveridentiteten kräver behörighet att fråga Microsoft Entra-ID för administrativa funktioner, vilket innefattar att skapa Microsoft Entra-användare och inloggningar och göra gruppexpansion för att tillämpa användarbehörigheter baserat på deras Microsoft Entra-gruppmedlemskap. Om serveridentitetsbehörigheter för att fråga Microsoft Entra-ID återkallas eller om serveridentiteten tas bort slutar Microsoft Entra-autentiseringen att fungera.

Tilldela Microsoft Entra-frågebehörigheter till serveridentiteten genom att lägga till den i rollen Katalogläsare eller tilldela följande Microsoft Graph-behörigheter på lägre nivå:

Kommentar

Det här skriptet måste köras av ett Microsoft Entra-ID Global Administrator eller ett Privileged Role Administrator.

Följande skript ger Microsoft Entra Directory Readers behörighet till en identitet som representerar den logiska servern för Azure SQL Database.

  • Ersätt <TenantId> med din TenantId insamlade tidigare.
  • Ersätt <ServerName> med namnet på den logiska servern. Om servernamnet är myserver.database.windows.netersätter du <ServerName> med myserver.
# This script grants "Directory Readers" permission to a service principal representing a logical server for Azure SQL Database
# It can be executed only by a user who is a member of the **Global Administrator** or **Privileged Role Administrator** role.
# To check if the "Directory Readers" role was granted, re-execute this script

Import-Module Microsoft.Graph.Authentication
$ServerIdentityName = "<ServerName>"    # Enter your logical server name
$TenantId = "<TenantId>"                # Enter your tenant ID

Connect-MgGraph -TenantId "<TenantId>" -Scopes "RoleManagement.ReadWrite.Directory,Application.Read.All"

# Get Microsoft Entra "Directory Readers" role and create if it doesn't exist
$roleName = "Directory Readers"
$role = Get-MgDirectoryRole -Filter "DisplayName eq '$roleName'"
if ($role -eq $null) {
    # Instantiate an instance of the role template
    $roleTemplate = Get-MgDirectoryRoleTemplate -Filter "DisplayName eq '$roleName'"
    New-MgDirectoryRoleTemplate -RoleTemplateId $roleTemplate.Id
    $role = Get-MgDirectoryRole -Filter "DisplayName eq '$roleName'"
}

# Get service principal for server
$roleMember = Get-MgServicePrincipal -Filter "DisplayName eq '$ServerIdentityName'"
$roleMember.Count
if ($roleMember -eq $null) {
    Write-Output "Error: No service principal with name '$($ServerIdentityName)' found, make sure that ServerIdentityName parameter was entered correctly."
    exit
}
if (-not ($roleMember.Count -eq 1)) {
    Write-Output "Error: Multiple service principals with name '$($ServerIdentityName)'"
    Write-Output $roleMember | Format-List DisplayName, Id, AppId
    exit
}

# Check if service principal is already member of Directory Readers role
$isDirReader = Get-MgDirectoryRoleMember -DirectoryRoleId $role.Id -Filter "Id eq '$($roleMember.Id)'"

if ($isDirReader -eq $null) {
    # Add principal to Directory Readers role
    Write-Output "Adding service principal '$($ServerIdentityName)' to 'Directory Readers' role'..."
    $body = @{
        "@odata.id"= "https://graph.microsoft.com/v1.0/directoryObjects/{$($roleMember.Id)}"
    }
    New-MgDirectoryRoleMemberByRef -DirectoryRoleId $role.Id -BodyParameter $body
    Write-Output "'$($ServerIdentityName)' service principal added to 'Directory Readers' role'."
} else {
    Write-Output "Service principal '$($ServerIdentityName)' is already member of 'Directory Readers' role'."
}

Kommentar

Utdata från det här skriptet anger om identiteten har tilldelats rollen Katalogläsare . Du kan köra skriptet igen om du är osäker på om behörigheten har beviljats.

En liknande metod för hur du tilldelar katalogläsarrollen för SQL Managed Instance finns i Etablera Microsoft Entra-administratör (SQL Managed Instance).

I produktionsmiljöer är en vanlig hanteringspraxis att tilldela rollen Katalogläsare till en rolltilldelningsbar grupp i Microsoft Entra-ID. Sedan kan gruppägare lägga till hanterade identiteter i gruppen. Detta upprätthåller principen om minsta behörighet och kringgår behovet av att en global administratör eller privilegierad rolladministratör beviljar katalogläsarrollen individuellt till varje SQL-instans. Mer information om den här funktionen finns i Katalogläsarroll i Microsoft Entra-ID för Azure SQL.

Skapa ett program i Microsoft Entra-ID

Registrera dina program. Om du vill registrera en app behöver du minst rollen Programutvecklare för Microsoft Entra-ID. Mer information om hur du tilldelar roller finns i Tilldela användarroller i Microsoft Entra-ID.

I den här självstudien används två huvudnamn för tjänsten. Det första tjänstens huvudnamn, DBOwnerApp, används för att skapa andra användare i databasen. Det andra tjänstens huvudnamn, myapp, är programmet som DBOwnerApp skapar en databasanvändare för senare i den här självstudien.

Så här registrerar du dina program:

  1. I Azure-portalen väljer du Microsoft Entra-ID> Appregistreringar> Ny registrering.

    Screenshot shows the Register an application page.

    När appregistreringen har skapats genereras och visas värdet program-ID (klient-ID ). Registrera det här värdet för framtida användning i den här självstudien.

    Screenshot of the Azure portal that shows the App ID.

  2. Skapa en klienthemlighet för programmet att logga in med. Följ ladda upp ett certifikat eller skapa en hemlighet för inloggning. Registrera klienthemligheten för DBOwnerApp för framtida användning i den här självstudien.

Mer information finns i Använda portalen för att skapa ett Microsoft Entra-program och tjänstens huvudnamn som kan komma åt resurser.

Skapa tjänstens huvudnamnsanvändare

Lägg till det nyligen skapade tjänstens huvudnamn, DBOwnerApp, som en användare i SQL Database och tilldela behörigheter till den.

Anslut till din SQL Database med hjälp av en Microsoft Entra-identitet som har behörighet att skapa andra användare.

Viktigt!

Endast Microsoft Entra-användare kan skapa andra Microsoft Entra-användare i Azure SQL Database. Inga användare baserat på SQL-autentisering, inklusive serveradministratören, kan skapa en Microsoft Entra-användare. Microsoft Entra-administratören är den enda användare som först kan skapa andra Microsoft Entra-användare i SQL Database. När Microsoft Entra-administratören har skapat andra användare kan alla Microsoft Entra-användare med rätt behörighet skapa andra Microsoft Entra-användare.

  1. Skapa användaren DBOwnerApp i SQL Database med följande T-SQL-kommando:

    CREATE USER [DBOwnerApp] FROM EXTERNAL PROVIDER
    GO
    
  2. För att skapa andra Microsoft Entra-användare krävs minst ALTER ANY USER SQL-behörigheten. Den här behörigheten ärvs också genom medlemskap i db_owneroch genom tilldelning som Microsoft Entra-administratör. I följande exempel visas tre olika alternativ för att tilldela behörigheter till DBOwnerApp som gör att den kan skapa andra Microsoft Entra-användare i databasen.

    Du kan lägga till DBOwnerApp i db_owner rollen med sp_addrolemember:

    EXEC sp_addrolemember 'db_owner', [DBOwnerApp]
    GO
    

    Du kan tilldela behörigheten ALTER ANY USER till DBOwnerApp som följande T-SQL-exempel:

    GRANT ALTER ANY USER TO [DBOwnerApp]
    GO
    

    Du kan ange DBOwnerApp som Microsoft Entra-administratör. Detta kan göras med hjälp av Azure-portalen, PowerShell eller Azure CLI-kommandon. Mer information finns i Etablera Microsoft Entra-administratör (SQL Database).

Skapa en användare med tjänstens huvudnamn

  1. Använd följande skript för att skapa en Microsoft Entra-tjänsthuvudnamnsanvändare med hjälp av tjänstens huvudnamn DBOwnerApp:

    • Ersätt <TenantId> med din TenantId insamlade tidigare.
    • Ersätt <ClientId> med din ClientId insamlade tidigare.
    • Ersätt <ClientSecret> med din klienthemlighet som skapades tidigare.
    • Ersätt <ServerName> med namnet på den logiska servern. Om servernamnet är myserver.database.windows.netersätter du <ServerName> med myserver.
    • Ersätt <database name> med ditt SQL Database-namn.
    # PowerShell script for creating a new SQL user called myapp using application DBOwnerApp with secret
    # DBOwnerApp is an admin for the server
    
    # Download latest  MSAL  - https://www.powershellgallery.com/packages/MSAL.PS
    Import-Module MSAL.PS
    
    $tenantId = "<TenantId>"   # Microsoft Entra tenant ID where DBOwnerApp resides
    $clientId = "<ClientId>"   # Application (client) ID recorded earlier for DBOwnerApp
    $clientSecret = "<ClientSecret>"   # Client secret for DBOwnerApp 
    $scopes = "https://database.windows.net/.default" # The endpoint
    
    $result = Get-MsalToken -RedirectUri $uri -ClientId $clientId -ClientSecret (ConvertTo-SecureString $clientSecret -AsPlainText -Force) -TenantId $tenantId -Scopes $scopes
    
    $Tok = $result.AccessToken
    #Write-host "token"
    $Tok
    
    $SQLServerName = "<ServerName>"    # Logical server name 
    $DatabaseName = "<database name>"   # Azure SQL database name
    
    Write-Host "Create SQL connection string"
    $conn = New-Object System.Data.SqlClient.SQLConnection 
    $conn.ConnectionString = "Data Source=$SQLServerName.database.windows.net;Initial Catalog=$DatabaseName;Connect Timeout=30"
    $conn.AccessToken = $Tok
    
    Write-host "Connect to database and execute SQL script"
    $conn.Open() 
    $ddlstmt = 'CREATE USER [myapp] FROM EXTERNAL PROVIDER;'
    Write-host " "
    Write-host "SQL DDL command"
    $ddlstmt
    $command = New-Object -TypeName System.Data.SqlClient.SqlCommand($ddlstmt, $conn)       
    
    Write-host "results"
    $command.ExecuteNonQuery()
    $conn.Close()
    

    Du kan också använda följande kod: Microsoft Entra-tjänstens huvudnamnsautentisering till Azure SQL Database. Ändra skriptet för att köra DDL-instruktionen CREATE USER [myapp] FROM EXTERNAL PROVIDER. Samma skript kan användas för att skapa en Microsoft Entra-användare eller -grupp i databasen.

  2. Kontrollera om användarens myapp finns i databasen genom att köra följande kommando:

    SELECT name, type, type_desc, CAST(CAST(sid as varbinary(16)) as uniqueidentifier) as appId
    FROM sys.database_principals
    WHERE name = 'myapp'
    GO
    

    Du bör se utdata som liknar följande:

    name	type	type_desc	appId
    myapp	E	EXTERNAL_USER	6d228f48-xxxx-xxxx-xxxx-xxxxxxxxxxxx
    

Nästa steg