azure - 使用带有 VSCode 的托管标识将本地 asp dotnet 核心应用程序连接到 Azure SQL
问题描述
我有一个托管在 azure 中的 Web 应用程序,它启用了系统管理的标识,我还有一个 Azure SQL 数据库,我已经启用了对该标识的访问。
当它在云中运行时,它可以正常工作并且可以查询数据库。但是,在本地运行时,我希望能够针对云数据库进行调试,但我想使用相同的连接方式(因为我们禁用了 SQL 登录)
我在 macOS 上运行 dotnet core 3.0 并在 IDE 中使用 VSCode ...有什么方法可以设置环境变量或允许我的本地实例连接的东西吗?我知道您可以通过登录 VS 在 Windows 和完整的 Visual Studio 上执行此操作。
我已经尝试过这些环境变量,但它似乎不起作用(使用与 azure 中的应用程序使用相同的 id)
"IdentityObjectId": "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"IdentityTenantId": "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"
解决方案
我现在已经完成了这项工作,这就是以后遇到这篇文章的任何人的方法。
我的配置设置背景:我添加了一个 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 身份验证。
推荐阅读
- html - 输入数字接受尾随破折号
- javascript - ArcGIS JavaScript County API 多边形图
- aframe - 如何定义相机移动的限制
- laravel - VueJS 作为 SPA 和 jwt 令牌,何时验证令牌
- jquery - 有一种方法可以将数据表/CSV 索引到 Elasticsearch
- hyperledger-fabric - Hyperledger Fabric 如何确保 couchdb 中状态的完整性?
- linux - GNU Parallel - 如何使用输入参数捕获具有名称的文件中的输出
- python - 如何通过正则表达式过滤 numpy 数组?
- eclipse - 在 Windows 10 中的 Eclipse Oxygen 上创建 MPI 项目
- python - html 到文本:将制表符后的所有内容移至新行