使用托管身份和VSCode将本地asp dotnet核心应用程序连接到Azure SQL

时间:2019-11-08 12:29:40

标签: azure asp.net-core .net-core visual-studio-code azure-sql-database

我有一个以azure托管的Web应用程序,它已打开系统管理的身份,也有一个Azure SQL数据库,已启用了对该身份的访问。

当它在云中运行时,它可以正常工作,并且可以查询数据库。但是,在本地运行时,我希望能够针对云数据库进行调试,但是我想使用相同的连接方式(因为我们已禁用了SQL登录名)

我在macOS上运行dotnet core 3.0,并在IDE中使用VSCode ...是否可以设置环境变量或某种允许我的本地实例连接的方法?我知道您可以通过登录VS在Windows和完整的Visual Studio上进行操作。

我尝试了这些环境变量,但似乎不起作用(使用与Azure中的应用程序所使用的ID相同的ID)

"IdentityObjectId": "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"IdentityTenantId": "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"

1 个答案:

答案 0 :(得分:0)

对于现在以后遇到这篇文章的任何人,我现在都可以使用它,这就是方法。

我的配置设置的背景: 我添加了一个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

我创建了一个天蓝色的AD组并将该用户添加到该组中。我还向该组添加了针对Azure Web应用程序的服务原理(托管身份)。

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身份验证访问此数据库,但是除非使用Azure AD帐户登录,否则您无法将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也位于其中。 / p>

对我来说,此问题的真正解决方案是在VS Code终端中运行“ az登录”,这似乎创建了一个“身份上下文”,使我可以从上方使用“管理员用户”进行登录,因此有权访问数据库。它不是完全像从Web应用程序本身运行的那样,但是它足够接近并且不需要启用第二个连接字符串或SQL身份验证。