SQL Database - Entra ID Authentication
Entra ID Admin Configuration (User)
Recommended for development โ Uses signed-in user as admin.
param principalId string
param principalName string
@allowed(['User', 'Group', 'Application'])
param principalType string = 'User'
resource sqlServer 'Microsoft.Sql/servers@2022-05-01-preview' = {
name: '${resourcePrefix}-sql-${uniqueHash}'
location: location
properties: {
administrators: {
administratorType: 'ActiveDirectory'
principalType: principalType
login: principalName
sid: principalId
tenantId: subscription().tenantId
azureADOnlyAuthentication: true
}
minimalTlsVersion: '1.2'
}
}โ ๏ธ Warning: If deploying from CI/CD with a service principal, set
principalTypeto'Application'. The default'User'only works for interactive (human) deployments.
Get signed-in user info:
az ad signed-in-user show --query "{id:id, name:displayName}" -o jsonSet as azd environment variables:
PRINCIPAL_INFO=$(az ad signed-in-user show --query "{id:id, name:displayName}" -o json)
azd env set AZURE_PRINCIPAL_ID $(echo $PRINCIPAL_INFO | jq -r '.id')
azd env set AZURE_PRINCIPAL_NAME $(echo $PRINCIPAL_INFO | jq -r '.name')๐ก Tip: Set these immediately after
azd initto avoid deployment failures.
Entra ID Admin Configuration (Group)
Recommended for production โ Uses Entra group for admin access.
resource sqlServer 'Microsoft.Sql/servers@2022-05-01-preview' = {
name: '${resourcePrefix}-sql-${uniqueHash}'
location: location
properties: {
administrators: {
administratorType: 'ActiveDirectory'
principalType: 'Group'
login: 'SQL Admins'
sid: entraGroupObjectId
tenantId: subscription().tenantId
azureADOnlyAuthentication: true
}
minimalTlsVersion: '1.2'
}
}Managed Identity Access
Grant app managed identity access via SQL:
CREATE USER [my-container-app] FROM EXTERNAL PROVIDER;
ALTER ROLE db_datareader ADD MEMBER [my-container-app];
ALTER ROLE db_datawriter ADD MEMBER [my-container-app];Common Database Roles
| Role | Permissions |
|---|---|
db_datareader | Read all tables |
db_datawriter | Insert, update, delete |
db_ddladmin | Create/modify schema |
db_owner | Full access |
Connection Strings
Entra ID Authentication (Recommended)
โ ๏ธ MANDATORY: When generating SQL connection strings for apps with Entra-only auth, ALWAYS include an
Authenticationparameter. UseAuthentication=Active Directory Defaultfor general scenarios (App Service, local dev) orAuthentication=Active Directory Managed Identitywhen a user-assigned managed identity with a specificUser Idis required (e.g., Azure Functions SQL bindings). Do NOT use manualAccessTokenassignment,DefaultAzureCredential().GetToken()patterns, or bare connection strings without an authentication parameter. TheAuthenticationparameter is required in both the Bicep infrastructure output (e.g., App ServiceconnectionStringsproperty) and in any application configuration files (e.g.,appsettings.json).
Server=tcp:{server}.database.windows.net,1433;Database={database};Authentication=Active Directory Default;Encrypt=True;TrustServerCertificate=False;Required for .NET applications:
Microsoft.Data.SqlClient(v5.1.0+)Azure.Identity(for local development)
Legacy SQL Authentication (โ DO NOT USE - EVER)
โ PROHIBITED โ NEVER generate connection strings with
User IDandPasswordparameters, and NEVER generateadministratorLoginoradministratorLoginPasswordBicep properties. This applies unconditionally โ do not include them in any conditional, ternary, or optional branch. SQL admin authentication is disabled in all subscriptions with Entra-only policies and violates Azure security best practices. Always use an Entra IDAuthentication=Active Directory DefaultorAuthentication=Active Directory Managed Identityconnection string above.