Not
Åtkomst till denna sida kräver auktorisation. Du kan prova att logga in eller byta katalog.
Åtkomst till denna sida kräver auktorisation. Du kan prova att byta katalog.
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.
Anmärkning
Microsoft Entra-ID kallades tidigare Azure Active Directory (Azure AD).
Mer information om Microsoft Entra-autentisering för Azure SQL finns i artikeln Använda Microsoft Entra-autentisering.
I den här tutorialen lär du dig följande:
- 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-databas för den här handledningen.
- Microsoft Entra-behörigheter
Privileged Role Administratori 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. Klient-ID finns på sidan Översikt för din Microsoft Entra ID-resurs i Azure-portalen. Kopiera tenant-ID och kör sedan följande PowerShell-kommando:
- Ersätt
<TenantId>med ditt Tenant ID.
Connect-AzAccount -Tenant <TenantId>Registrera
TenantIdfö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.netersätter du<ServerName>medmyserver.
Set-AzSqlServer -ResourceGroupName <ResourceGroupName> -ServerName <ServerName> -AssignIdentity- Ersätt
Kontrollera att serveridentiteten har tilldelats framgångsrikt. Kör följande PowerShell-kommando:
- Ersätt
<ResourceGroupName>och<ServerName>med dina resurser. Om servernamnet ärmyserver.database.windows.netersätter du<ServerName>medmyserver.
$xyz = Get-AzSqlServer -ResourceGroupName <ResourceGroupName> -ServerName <ServerName> $xyz.identityDina utdata bör visa dig
PrincipalId,TypeochTenantId. Den tilldelade identiteten ärPrincipalId.- 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å:
Anmärkning
Det här skriptet måste köras av en Microsoft Entra Privileged Role Administrator - eller högre roll.
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>medTenantIdsom du samlade in tidigare. - Ersätt
<ServerName>med namnet på den logiska servern. Om servernamnet ärmyserver.database.windows.netersä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 **Privileged Role Administrator** or higher 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'."
}
Anmärkning
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 Ange Microsoft Entra-administratör.
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 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 applikationer. Om du vill registrera en app behöver du minst rollen Applikationsutvecklare för Microsoft Entra ID. Mer information om hur du tilldelar roller finns i Tilldela användarroller i Microsoft Entra-ID.
I denna handledning används två tjänsteprincipaler. 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.
Registrera 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 bruk i den här handledningen.
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 hittar du i Använd portalen för att skapa ett Microsoft Entra-program och tjänstehuvudnamn som kan komma åt resurser.
Skapa tjänstens principanvä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 GOFör att skapa andra Microsoft Entra-användare krävs minst
ALTER ANY USERSQL-behörigheten. Den här behörigheten ärvs också genom medlemskap idb_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_ownerrollen med sp_addrolemember:EXEC sp_addrolemember 'db_owner', [DBOwnerApp] GODu kan tilldela behörigheten
ALTER ANY USERtill DBOwnerApp som följande T-SQL-exempel:GRANT ALTER ANY USER TO [DBOwnerApp] GODu 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 Ange Microsoft Entra-administratör.
Skapa en användare med tjänstens huvudnamn
Använd följande skript för att skapa en Microsoft Entra-tjänsteanvändare myapp med hjälp av tjänsthuvudet DBOwnerApp:
- Ersätt
<TenantId>med denTenantIdsom du samlade in tidigare. - Ersätt
<ClientId>medClientIdsom du samlade in tidigare. - Ersätt
<ClientSecret>med din klienthemlighet som skapades tidigare. - Ersätt
<ServerName>med namnet på den logiska servern. Om servernamnet ärmyserver.database.windows.netersä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änsthuvudautentisering 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' GODu bör se liknande utdata:
name type type_desc appId myapp E EXTERNAL_USER aaaaaaaa-0000-1111-2222-bbbbbbbbbbbb
Relaterat innehåll
- Microsoft Entra tjänsthuvudman 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