使用Azure SQL DB的Azure应用服务(托管身份)

wqsoz72f  于 2023-04-22  发布在  其他
关注(0)|答案(1)|浏览(146)

我正在尝试使用托管标识(系统分配)设置从Azure应用服务到Azure SQL DB的连接
下面是设置:一个服务计划中有两个Azure应用程序服务,一个用于应用程序,一个用于API。我在Azure中有一个SQL服务器,其中有两个Azure SQL DB。应用程序服务打开了其系统分配的托管身份。我在项目(应用程序和API)中有多个环境的应用程序设置。
appsettings.json、appsettings.development.json、appsettings.acceptance.json、appsettings.production.json
当我从yaml pipeline将我的应用程序部署到应用程序服务后探索Kudu时,我看到所有应用程序设置文件都可用。
Azure应用服务中的configuration -〉application设置除了我在Azure中配置应用服务时在模板中添加的应用洞察工具键(IaC)之外没有任何变量。
在数据库db 1和db2中,这两个应用程序服务的托管标识都被分配了db角色

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文件中,我有两个DB的连接字符串

"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.关键字:'authentication'。注意:我正在使用EFCore,并且在这两个项目中都添加了Microsoft.Data.SqlClient(最新版本5.x.x)包。
1.如果所有的应用程序设置文件都被推送(如Kudu中所见),将读取哪个应用程序设置?appsettings.json或任何其他特定环境?据我所知,应该是appsettings.json。
1.我已经尝试了连接字符串的其他变体,更改了身份验证值(默认,集成等),但看到了相同的错误。我还尝试在Azure App Service -〉Configuration -〉application setting(也在连接字符串部分)中添加连接字符串,但我得到了相同的错误。据我所知,首选项应该是从Configuration部分,然后应用程序设置文件。
1.处理不同环境的应用程序设置的最佳方法是在解决方案中只使用appsettings.json和appsettings.development.json,并在配置Azure应用程序服务(IaC模板)时为所有环境创建,不同环境的参数文件可以具有所需的设置(从密钥库中提取)?还是其他方法更好,更简单,更安全?

xxslljrj

xxslljrj1#

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

相关问题