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
ellerPrivileged 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
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.- Ersätt
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 ärmyserver.database.windows.net
ersätter du<ServerName>
medmyserver
.
Set-AzSqlServer -ResourceGroupName <ResourceGroupName> -ServerName <ServerName> -AssignIdentity
- Ersätt
Kontrollera att serveridentiteten har tilldelats. Kör följande PowerShell-kommando:
- Ersätt
<ResourceGroupName>
och<ServerName>
med dina resurser. Om servernamnet ärmyserver.database.windows.net
ersätter du<ServerName>
medmyserver
.
$xyz = Get-AzSqlServer -ResourceGroupName <ResourceGroupName> -ServerName <ServerName> $xyz.identity
Dina utdata bör visa dig
PrincipalId
,Type
ochTenantId
. Den tilldelade identitetenPrincipalId
är .- Ersätt
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.
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 dinTenantId
insamlade tidigare. - Ersätt
<ServerName>
med namnet på den logiska servern. Om servernamnet ärmyserver.database.windows.net
ersätter du<ServerName>
medmyserver
.
# 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:
I Azure-portalen väljer du Microsoft Entra-ID> Appregistreringar> Ny registrering.
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.
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.
Skapa användaren DBOwnerApp i SQL Database med följande T-SQL-kommando:
CREATE USER [DBOwnerApp] FROM EXTERNAL PROVIDER GO
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 idb_owner
och 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
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 dinTenantId
insamlade tidigare. - Ersätt
<ClientId>
med dinClientId
insamlade tidigare. - Ersätt
<ClientSecret>
med din klienthemlighet som skapades tidigare. - Ersätt
<ServerName>
med namnet på den logiska servern. Om servernamnet ärmyserver.database.windows.net
ersätter du<ServerName>
medmyserver
. - 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.- Ersätt
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
- Microsoft Entra-tjänstens huvudnamn med Azure SQL
- Vad är hanterade identiteter för Azure-resurser?
- Så här använder du hanterade identiteter för App Service och Azure Functions
- Microsoft Entra-tjänstens huvudnamnsautentisering till SQL DB – kodexempel
- Översikt över program- och tjänstobjekt i Microsoft Entra ID
- Skapa ett Huvudnamn för Azure-tjänsten med Azure PowerShell
- Katalogläsarroll i Microsoft Entra-ID för Azure SQL