Azure SQL能否通过含托管标识的安全组实现权限管理?
问题
已为Azure应用服务配置系统生成的托管标识,Azure SQL数据库已设置AAD管理员(指向我所属的安全组)。尝试使用包含该应用服务托管标识的安全组database-readerwriter-test,通过以下SQL语句创建外部用户并分配角色:
CREATE USER [database-readerwriter-test] FROM EXTERNAL PROVIDER GO ALTER ROLE db_datareader ADD MEMBER [database-readerwriter-test] GO ALTER ROLE db_datawriter ADD MEMBER [database-readerwriter-test] GO
应用服务使用连接字符串Server=tcp:<databaseserver>.database.windows.net,1433;Initial Catalog=<databasename>;Encrypt=True;TrustServerCertificate=False;Connection Timeout=30;Authentication='Active Directory Default';连接数据库时,触发报错:
Microsoft.Data.SqlClient.SqlException (0x80131904): Login failed for user '<token-identified principal>'. at Microsoft.Data.ProviderBase.DbConnectionPool.CheckPoolBlockingPeriod(Exception e) ...
但直接为应用服务test-webapp创建外部用户并赋权时,连接正常:
CREATE USER [test-webapp] FROM EXTERNAL PROVIDER GO ALTER ROLE db_datareader ADD MEMBER [test-webapp] GO ALTER ROLE db_datawriter ADD MEMBER [test-webapp] GO
已确认数据库主体的ObjectID与AAD组一致,现咨询:是否支持使用包含应用服务/函数托管标识的安全组,通过托管标识连接Azure SQL,从而在AAD中管理权限而非SQL脚本?
回答
支持通过包含托管标识的AAD安全组连接Azure SQL,你遇到的登录失败问题,核心原因是应用服务托管标识默认获取的访问令牌中不包含所属安全组的声明信息,导致Azure SQL无法识别该标识属于已授权的安全组。
解决方法如下:
- 为应用服务的系统分配托管标识配置组声明:
- 进入应用服务的「身份」页面,切换到「系统分配的」标签
- 点击「Azure AD 令牌配置」,添加「组声明」,选择「安全组」(可按需选择“所有组”或“仅安全组”)
- 保存配置后重启应用服务,使设置生效
- 确认AAD安全组
database-readerwriter-test已包含应用服务的托管标识,且你已完成的SQL授权操作(创建外部用户、分配角色)无误 - 保持原有连接字符串配置不变,等待令牌更新(通常5-10分钟)后重新测试连接
这种方式完全可以实现通过AAD管理权限:后续只需在AAD中调整安全组的成员,无需修改SQL脚本,权限会自动同步到Azure SQL,符合你想要的权限管理模式。
内容的提问来源于stack exchange,提问作者DShorty
相关产品推荐
相关产品推荐

