我现在已经完成了这项工作,这就是以后遇到此帖子的任何人的方法。
我的配置设置的背景:
我添加了一个 azure AD 用户作为管理员,并授予该用户对 azure sql 的访问权限。
azureaduser=$(az ad user list --filter "userPrincipalName eq 'MYUSERNAME'" --query [].objectId --output tsv)
az sql server ad-admin create --resource-group MYRESOURCEGROUP --server-name MYSQLSERVER.database.windows.net --display-name ADMIN --object-id $azureaduser
我创建了一个 azure AD 组并将该用户添加到该组。我还将 azure webapp 的服务原则(托管标识)添加到该组。
groupid=$(az ad group create --display-name sqlAccessGroup --mail-nickname sqlAccessGroup --query objectId --output tsv)
msiobjectid=$(az webapp identity show --resource-group RESOURCEGROUPNAME --name MYWEBAPPNAME --query principalId --output tsv)
az ad group member add --group $groupid --member-id $msiobjectid
以该管理员用户身份登录,我可以通过 Azure Cloud Shell 连接到数据库并运行 sqlcmd
sqlcmd -S MYSERVER.database.windows.net -d MYDATABASE -U "MYUSER@MYSUBSCRIPTION.onmicrosoft.com" -P "MYPASSWORD" -G -l 30
注意:我已经可以使用 SQL 身份验证访问此数据库,但您无法将 AD 组/用户添加到数据库,除非您使用 Azure AD 帐户登录(因此之前创建了管理员帐户)
CREATE USER [sqlAccessGroup] FROM EXTERNAL PROVIDER;
ALTER ROLE db_datareader ADD MEMBER [sqlAccessGroup];
ALTER ROLE db_datawriter ADD MEMBER [sqlAccessGroup];
ALTER ROLE db_ddladmin ADD MEMBER [sqlAccessGroup];
GO
我还在我的 Azure SQL 上关闭了允许 Azure 服务访问,因此我必须将 Web 应用程序的出站 IP 添加到防火墙......说到防火墙,请确保您的本地计算机的 IP 也在其中。
对我来说,这个问题的真正解决方案是在 VS Code 的终端中运行“az login”,这似乎创建了一个“身份上下文”,允许我使用上面的“管理员用户”登录,因此有权访问数据库。 完全不像从 Web 应用程序本身运行,但它足够接近并且不需要启用第二个连接字符串或 SQL 身份验证。