sql-server - 使用 EF Core、Docker 和系统分配标识从 Web 应用程序访问 Azure SQL

标签 sql-server azure entity-framework docker .net-core

我正在尝试从在 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/

相关文章:

c# - FluentMigrator-在删除外键之前检查它是否存在

entity-framework - 使用 EF Code First 示例编写契约(Contract)和 Fluent API

c# - 加入 LINQ 和 Entity Framework

c# - 多个数据提供者/ORM 上的存储库模式?

SQL 服务器 : splitting a column to multiple columns with joined table

c# - 从 SQL Server 中选择百万条记录

azure - 文件转换和变量替换选项在 Azure 应用服务 Linux Web 应用上不可用

azure - 容器间 blob 传输非常慢

azure - 从 CosmosDB 的集合中读取所有分区的文档

sql - 使用 Firedac 运行 SQL 存储过程