如何在仅允许Azure Web应用访问的Azure SQL中执行授权查询?
解决方法
方法一:临时添加自己为AD管理员,执行后移除
这是最直接的操作方式,步骤如下:
- 用Azure CLI更新SQL Server的AD管理员,把你的Azure AD账户加进去:
(可以通过az sql server ad-admin create --resource-group MY_GROUP --server-name MY_SERVER --display-name "你的名字" --object-id "你的Azure AD对象ID"az ad user show --id "你的邮箱"获取自己的object-id) - 现在你就能用Azure Data Studio或Azure查询编辑器,通过Azure AD身份验证连接数据库,执行需要的授权语句:
CREATE USER some_user_name FROM EXTERNAL PROVIDER; ALTER ROLE db_datareader ADD MEMBER some_user_name; ALTER ROLE db_datawriter ADD MEMBER some_user_name; ALTER ROLE db_ddladmin ADD MEMBER some_user_name; - 操作完立刻移除自己的管理员权限,恢复到仅Web应用作为管理员的状态:
az sql server ad-admin delete --resource-group MY_GROUP --server-name MY_SERVER
方法二:通过Web应用的托管身份执行SQL语句
不用修改服务器管理员,直接借助Web应用的MSI身份来执行脚本,步骤如下:
- 在Web应用里加一段临时代码(比如ASP.NET Core、Python脚本都行),用MSI身份连接SQL并执行授权语句。举个C#的示例:
using System.Data.SqlClient; using Azure.Identity; var sqlConnectionString = "Server=tcp:MY_SERVER.database.windows.net,1433;Database=MY_DATABASE;Authentication=Active Directory Managed Identity;"; using var connection = new SqlConnection(sqlConnectionString); connection.Open(); var sqlCommands = new[] { "CREATE USER some_user_name FROM EXTERNAL PROVIDER;", "ALTER ROLE db_datareader ADD MEMBER some_user_name;", "ALTER ROLE db_datawriter ADD MEMBER some_user_name;", "ALTER ROLE db_ddladmin ADD MEMBER some_user_name;" }; foreach (var cmdText in sqlCommands) { using var command = new SqlCommand(cmdText, connection); command.ExecuteNonQuery(); } - 把这段临时代码部署到Web应用,访问对应的触发端点执行脚本。
- 执行完成后,立刻删除这段临时代码和端点,避免安全风险。
注意事项
- 方法一要记得及时移除自己的管理员权限,别留下安全隐患。
- 方法二的临时代码要做好访问限制,比如只允许特定IP访问,用完就删。
内容的提问来源于stack exchange,提问作者limitIntegral314
相关产品推荐
相关产品推荐

