gpt4 book ai didi

具有 Azure SQL DB(托管标识)的 Azure 应用服务

转载 作者:行者123 更新时间:2023-12-03 06:19:02 25 4
gpt4 key购买 nike

我正在尝试使用托管标识(系统分配)设置从 azure 应用服务到 azure sql db 的连接

设置如下:一项服务计划中提供两项 Azure 应用服务,一项用于应用程序,一项用于 API。我在 Azure 中有一个 SQL 服务器,有两个 azure sql 数据库。应用程序服务已打开系统分配的托管标识。我在项目(应用程序和 api)中都有多个环境的应用程序设置。

appsettings.json、appsetings.development.json、appsettings.acceptance.json、appsettings.product.json

当我从 yaml 管道将应用程序部署到应用程序服务后探索 Kudu 时,我看到所有应用程序设置文件都可用。

Azure 应用服务中的配置 -> 应用程序设置除了我在 Azure 中配置应用服务时在模板中添加 (IaC) 的应用洞察检测 key 之外没有任何变量。

两个应用服务的托管身份已在数据库 db1 和 db2 中分配了数据库角色

CREATE USER [<identity-name>] FROM EXTERNAL PROVIDER;
ALTER ROLE db_datareader ADD MEMBER [<identity-name>];
ALTER ROLE db_datawriter ADD MEMBER [<identity-name>];
ALTER ROLE db_ddladmin ADD MEMBER [<identity-name>];

在我的应用程序设置 json 文件中,我有两个数据库的连接字符串

"connectionStrings": {
"DB1Context": "Server=myserver.database.windows.net;Authentication=Active Directory Managed Identity;Encrypt=True;Database=db1;",
"DB2Context": "Server=myserver.database.windows.net;Authentication=Active Directory Managed Identity;Encrypt=True;Database=db2;",

Program.cs(读取连接字符串)

builder.Services.AddHangfire(options =>
{
options.UseSqlServerStorage(builder.Configuration.GetConnectionString("DB1Context"),
new SqlServerStorageOptions
{
});
});

builder.Services.AddDbContext<DbContext>(options=>
{
options.UseSqlServer(builder.Configuration.GetCOnnectionString("DB2Context"));
});

问题:

  1. 从控制台(在 Azure 内)执行 dotnet webapp.dll 时,出现以下错误:未处理的异常。 System.ArgumentException.Keyword 不受支持:“身份验证”。注意:我正在使用 EFCore,并且还在两个项目中添加了 Microsoft.Data.SqlClient 包(最新版本 5.x.x)。

  2. 如果推送所有应用程序设置文件(如 Kudu 中所示),将读取哪个应用程序设置? appsettings.json 或任何其他特定环境?据我了解,它应该是appsettings.json。

  3. 我尝试了身份验证值已更改的连接字符串的其他变体(默认、集成等),但看到了相同的错误。我还尝试在 Azure 应用服务 -> 配置 -> 应用程序设置(也在连接字符串部分)中添加连接字符串,但出现相同的错误。据我了解,首选项应该来自配置部分,然后是应用程序设置文件。

  4. 处理不同环境的应用程序设置的最佳方法是在解决方案中仅包含 appsettings.json 和 appsettings.development.json,并在预配 azure 应用程序服务(IaC 模板)时为所有环境创建,不同环境的参数文件可以有所需的设置(从 key 保管库中提取)?或者还有其他更好、更简单、更安全的方法吗?

最佳答案

Hangfire.SqlServer 1.7.34 仍然使用 System.Data.SqlClient 而不是 Microsoft.Data.SqlClient。不过,您可以指示它使用 Microsoft.Data 命名空间:

.UseSqlServerStorage(
() => new Microsoft.Data.SqlClient.SqlConnection(builder.Configuration.GetConnectionString("DB1Context")));

参见this issuethis one引用上面的代码。

关于具有 Azure SQL DB(托管标识)的 Azure 应用服务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/76021615/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com