Loading source
Pulling the file list, source metadata, and syntax-aware rendering for this listing.
Source from repo
Prepare Azure environments for new workloads—subscriptions, networking, identity, and landing zones
Files
Skill
Size
Entrypoint
Format
Open file
Syntax-highlighted preview of this file as included in the skill package.
references/services/sql-database/auth.md
1# SQL Database - Entra ID Authentication23## Entra ID Admin Configuration (User)45**Recommended for development** — Uses signed-in user as admin.67```bicep8param principalId string9param principalName string10@allowed(['User', 'Group', 'Application'])11param principalType string = 'User'1213resource sqlServer 'Microsoft.Sql/servers@2022-05-01-preview' = {14name: '${resourcePrefix}-sql-${uniqueHash}'15location: location16properties: {17administrators: {18administratorType: 'ActiveDirectory'19principalType: principalType20login: principalName21sid: principalId22tenantId: subscription().tenantId23azureADOnlyAuthentication: true24}25minimalTlsVersion: '1.2'26}27}28```2930> ⚠️ **Warning:** If deploying from CI/CD with a service principal, set `principalType` to `'Application'`. The default `'User'` only works for interactive (human) deployments.3132**Get signed-in user info:**33```bash34az ad signed-in-user show --query "{id:id, name:displayName}" -o json35```3637**Set as azd environment variables:**38```bash39PRINCIPAL_INFO=$(az ad signed-in-user show --query "{id:id, name:displayName}" -o json)40azd env set AZURE_PRINCIPAL_ID $(echo $PRINCIPAL_INFO | jq -r '.id')41azd env set AZURE_PRINCIPAL_NAME $(echo $PRINCIPAL_INFO | jq -r '.name')42```4344> 💡 **Tip:** Set these immediately after `azd init` to avoid deployment failures.4546## Entra ID Admin Configuration (Group)4748**Recommended for production** — Uses Entra group for admin access.4950```bicep51resource sqlServer 'Microsoft.Sql/servers@2022-05-01-preview' = {52name: '${resourcePrefix}-sql-${uniqueHash}'53location: location54properties: {55administrators: {56administratorType: 'ActiveDirectory'57principalType: 'Group'58login: 'SQL Admins'59sid: entraGroupObjectId60tenantId: subscription().tenantId61azureADOnlyAuthentication: true62}63minimalTlsVersion: '1.2'64}65}66```6768## Managed Identity Access6970Grant app managed identity access via SQL:7172```sql73CREATE USER [my-container-app] FROM EXTERNAL PROVIDER;74ALTER ROLE db_datareader ADD MEMBER [my-container-app];75ALTER ROLE db_datawriter ADD MEMBER [my-container-app];76```7778## Common Database Roles7980| Role | Permissions |81|------|-------------|82| `db_datareader` | Read all tables |83| `db_datawriter` | Insert, update, delete |84| `db_ddladmin` | Create/modify schema |85| `db_owner` | Full access |8687## Connection Strings8889### Entra ID Authentication (Recommended)9091> ⚠️ **MANDATORY**: When generating SQL connection strings for apps with Entra-only auth, ALWAYS include an `Authentication` parameter. Use `Authentication=Active Directory Default` for general scenarios (App Service, local dev) or `Authentication=Active Directory Managed Identity` when a user-assigned managed identity with a specific `User Id` is required (e.g., Azure Functions SQL bindings). Do NOT use manual `AccessToken` assignment, `DefaultAzureCredential().GetToken()` patterns, or bare connection strings without an authentication parameter. The `Authentication` parameter is required in both the Bicep infrastructure output (e.g., App Service `connectionStrings` property) and in any application configuration files (e.g., `appsettings.json`).9293```94Server=tcp:{server}.database.windows.net,1433;Database={database};Authentication=Active Directory Default;Encrypt=True;TrustServerCertificate=False;95```9697**Required for .NET applications:**98- `Microsoft.Data.SqlClient` (v5.1.0+)99- `Azure.Identity` (for local development)100101### Legacy SQL Authentication (⛔ DO NOT USE - EVER)102103> ❌ **PROHIBITED — NEVER generate connection strings with `User ID` and `Password` parameters, and NEVER generate `administratorLogin` or `administratorLoginPassword` Bicep properties.**104> This applies unconditionally — do not include them in any conditional, ternary, or optional branch.105> SQL admin authentication is disabled in all subscriptions with Entra-only policies and violates Azure security best practices.106> Always use an Entra ID `Authentication=Active Directory Default` or `Authentication=Active Directory Managed Identity` connection string above.107