我正在尝试从在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://docs.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用户流程进行了详细说明
答案 0 :(得分:1)
首先,您需要建立SQL数据库AAD-enabled。然后,您可以像这样为托管身份创建用户
CREATE USER [<identity-name>] FROM EXTERNAL PROVIDER;
然后当然根据需要向该用户分配权限。