Azure SQL与App Service托管标识配置疑问及Bicep脚本需求
Azure SQL + 托管身份配置问题解答
1. 创建角色分配是否需要AAD P1/P2?
不需要。AAD免费版完全支持Azure RBAC角色分配和托管身份的基础功能。AAD P1/P2是用于高级身份治理(比如条件访问、身份保护、特权身份管理)的付费功能,和配置托管身份访问Azure SQL的核心流程无关。只要你有目标资源(比如App Service、SQL Server)的所有者或参与者权限,就能完成角色分配和权限配置。
2. 实现配置的Bicep脚本示例
以下是完整的Bicep模板,包含系统托管身份的App Service、Azure SQL Database,以及配置App Service身份访问SQL的权限:
// 目标资源组和位置 param resourceGroupName string param location string = resourceGroup().location // SQL Server参数 param sqlServerName string param sqlAdminLogin string param sqlAdminPassword string param sqlDatabaseName string = 'AppDB' // App Service参数 param appServiceName string param appServicePlanName string = 'AppServicePlan' // 1. 创建App Service计划 resource appServicePlan 'Microsoft.Web/serverfarms@2023-01-01' = { name: appServicePlanName location: location sku: { name: 'B1' // 根据需求调整SKU tier: 'Basic' } } // 2. 创建带系统托管身份的App Service resource appService 'Microsoft.Web/sites@2023-01-01' = { name: appServiceName location: location identity: { type: 'SystemAssigned' // 启用系统托管身份 } properties: { serverFarmId: appServicePlan.id siteConfig: { alwaysOn: true } } } // 3. 创建SQL Server resource sqlServer 'Microsoft.Sql/servers@2023-02-01-preview' = { name: sqlServerName location: location properties: { administratorLogin: sqlAdminLogin administratorLoginPassword: sqlAdminPassword version: '12.0' } } // 4. 创建SQL Database resource sqlDatabase 'Microsoft.Sql/servers/databases@2023-02-01-preview' = { parent: sqlServer name: sqlDatabaseName location: location sku: { name: 'GP_Gen5_2' // 根据需求调整SKU } } // 5. 配置SQL Server的AAD管理员(必须设置,否则无法用AAD身份访问) resource sqlServerAadAdmin 'Microsoft.Sql/servers/administrators@2023-02-01-preview' = { parent: sqlServer name: 'activeDirectory' properties: { administratorType: 'ActiveDirectory' login: 'AAD-SQL-Admin' // 替换为你的AAD组或用户名称 sid: '<AAD-ADMIN-OBJECT-ID>' // 替换为AAD组/用户的Object ID tenantId: subscription().tenantId } } // 6. 给App Service的托管身份分配SQL DB的权限 // 注意:需要先在SQL中创建对应的AAD用户,这里用post-deployment脚本执行 resource sqlDbUserScript 'Microsoft.Resources/deploymentScripts@2023-08-01' = { name: 'CreateSqlDbUser' location: location kind: 'AzurePowerShell' properties: { azPowerShellVersion: '7.4' scriptContent: ''' $context = Get-AzContext $serverName = "${sqlServerName}" $dbName = "${sqlDatabaseName}" $identityObjectId = "${appService.identity.principalId}" $identityName = "${appService.name}" # 连接SQL并创建AAD用户 $sqlConnectionString = "Server=tcp:$serverName.database.windows.net,1433;Initial Catalog=$dbName;Authentication=Active Directory Default;Encrypt=True" $sqlCommand = @" CREATE USER [$identityName] FROM EXTERNAL PROVIDER; ALTER ROLE db_datareader ADD MEMBER [$identityName]; ALTER ROLE db_datawriter ADD MEMBER [$identityName]; "@ Invoke-SqlCmd -ConnectionString $sqlConnectionString -Query $sqlCommand ''' cleanupPreference: 'OnSuccess' timeout: 'PT10M' } }
使用说明:
- 替换
<AAD-ADMIN-OBJECT-ID>为你的AAD用户或组的Object ID(该账号需要有SQL Server的管理员权限) - 根据业务需求调整SKU和权限(比如添加
db_owner或自定义角色)
3. 是否必须采用Azure AD认证?
不是强制要求,但强烈推荐。如果不用Azure AD认证,你只能依赖传统的SQL账号密码,生产环境中存在以下问题:
- 密码需要定期轮换,增加运维成本
- 密码可能被泄露或硬编码在配置中,带来安全风险
- 无法利用AAD的身份治理功能(比如MFA、条件访问)
托管身份+Azure AD认证是生产环境的最佳实践,完全避免了密码管理的痛点。
4. 本地开发时如何连接数据库?
本地开发时可以通过以下几种方式连接,不需要依赖App Service的托管身份:
方式1:使用个人AAD账号连接
- 在SQL Database中创建你的AAD用户:
CREATE USER [你的AAD邮箱] FROM EXTERNAL PROVIDER; - 给该用户分配权限:
ALTER ROLE db_datareader ADD MEMBER [你的AAD邮箱]; - 连接时选择Azure AD交互式认证(SSMS、Azure Data Studio或代码中都支持),会弹出登录窗口验证你的AAD账号。
- 在SQL Database中创建你的AAD用户:
方式2:使用AAD应用注册身份连接
- 在AAD中创建一个应用注册,生成客户端密钥
- 在SQL Database中创建该应用的用户:
CREATE USER [应用注册名称] FROM EXTERNAL PROVIDER; - 给应用分配权限,然后在本地代码中使用应用的客户端ID、密钥和租户ID构建连接字符串,采用
Azure AD Service Principal认证方式。
方式3:临时使用SQL账号(不推荐生产)
本地调试时可以临时使用SQL管理员账号或专用SQL账号,但注意不要把密码提交到代码仓库,调试完成后建议禁用该账号。
内容的提问来源于stack exchange,提问作者lcj
相关产品推荐
相关产品推荐

