我正在尝试从在 Linux 下运行 Docker 容器的 Azure Web 应用程序访问无服务器 Azure SQL 数据库。该容器是使用最新 EF Core 的 .Net Core 3.1 Web 应用程序。 Web 应用程序已配置为使用系统分配的身份。
对于 SQL 用户,我使用以下 PS 脚本来获取 SID,其中对象 ID 是系统分配的身份对象 ID:
$principal = Get-AzADServicePrincipal -ObjectId $objectId
foreach ($byte in $principal.ApplicationId.ToByteArray())
{
$byteGuid += [System.String]::Format("{0:X2}", $byte)
}
$sid = "0x" + $byteGuid
然后,我使用这样的 SID 创建了数据库的具有 db_owner 角色的用户...
'CREATE USER [AppUser] WITH DEFAULT_SCHEMA=[dbo], SID=' + '$(AppSiD)' + ' , TYPE = E'
...类似于此处描述的过程:
https://blog.bredvid.no/handling-azure-managed-identity-access-to-azure-sql-in-an-azure-devops-pipeline-1e74e1beb10b
我还使用以下方法更新了 EF 实例:
https://learn.microsoft.com/en-us/azure/app-service/app-service-web-tutorial-connect-msi#modify-aspnet-core
当应用程序尝试访问数据库时,抛出以下异常:
Microsoft.Data.SqlClient.SqlException (0x80131904): Login failed for user '<token-identified principal>'.
编辑我不认为 SQL 用户导致了该问题,因为无论用户是否存在都会发生错误。
我更愿意修复上述错误,但如果有其他方法可以在不使用 SQL 用户的情况下连接到数据库,我将不胜感激。
谢谢
编辑
详细介绍了 SQL 用户流程,因为发布时链接已关闭
最佳答案
首先您需要创建 SQL 数据库 AAD-enabled 。然后您可以像这样为您的托管身份创建一个用户
CREATE USER [<identity-name>] FROM EXTERNAL PROVIDER;
当然,然后根据需要向该用户分配权限。
关于sql-server - 使用 EF Core、Docker 和系统分配标识从 Web 应用程序访问 Azure SQL,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63341918/