【发布时间】:2021-11-08 18:50:15
【问题描述】:
我相信我正在遵循 Microsoft 推荐的方法,并且我拥有所需的组件,但不知道如何将它们组合在一起。
我正在使用 Azure 应用程序配置服务来存储密钥保管库密钥(以及其他配置设置),并使用密钥保管库服务来提供包含 Azure SQL Server 用户名/密码的数据库连接字符串)
我有以下单独的工作项目/解决方案 (ASP.NET Core MVC):
- 具有 Azure SQL DB 功能的可运行的 Azure Web 应用程序,可输出 CRUD 和表数据
- 一个有效的 Azure Web 应用程序,使用 Azure 应用程序配置为密钥和密钥库输出字符串“秘密”
- 我已使用托管 ID 访问所有 Azure 资源
使用 测试应用程序,我可以使用 3 个项目文件中的代码从我的 Azure 应用程序配置和 Key Vault 服务中输出虚拟配置数据:
- Program.cs
webBuilder.ConfigureAppConfiguration((context, config) - appsettings.json
"AzureAppConfigurationEndpoint": "https://xxxxxxxxxx.azconfig.io" - /Views/~/razor 页面
@Configuration["TestApp:Settings:KeyVaultDbString"]
我的 db app 使用这些文件中的代码访问 db 连接字符串:
- Startup.cs
public void ConfigureServices(IServiceCollection services) - appsettings.json
"DefaultConnection":"Server=tcp:xxxx.database.windows.net,1433;XXXXXXX"
我想升级我的 db app 以使用 test app 提供的连接字符串配置值。因此计划是:
将测试应用 Program.cs 中的代码合并到数据库应用 Program.cs 中。我认为这没有问题。
public static IHostBuilder CreateHostBuilder(string[] args) =>
Host.CreateDefaultBuilder(args)
.ConfigureWebHostDefaults(webBuilder =>
{
webBuilder.ConfigureAppConfiguration((context, config) =>
{
var settings = config.Build();
var appConfigurationEndpoint = settings["AzureAppConfigurationEndpoint"];
config.AddAzureAppConfiguration(options =>
{
options.Connect(new Uri(appConfigurationEndpoint), new DefaultAzureCredential());
options.ConfigureKeyVault(kv =>
{
kv.SetCredential(new DefaultAzureCredential());
});
});
webBuilder.UseStartup<Startup>();
});
});
但是。此时我不知道如何访问 Startup.cs 中的["TestApp:Settings:KeyVaultDbString"] 配置数据。提供"KeyVaultDbString" 代替我的"DefaultConnection"。
这是现有的代码:
public void ConfigureServices(IServiceCollection services)
{
services.AddDbContext<ApplicationDbContext>(options =>
options.UseSqlServer(
Configuration.GetConnectionString("DefaultConnection")));
services.AddDatabaseDeveloperPageExceptionFilter();
services.AddDefaultIdentity<IdentityUser>(options => options.SignIn.RequireConfirmedAccount = true)
.AddEntityFrameworkStores<ApplicationDbContext>();
services.AddControllersWithViews();
// this code is responsible for login-intercept required for solution
services.AddAuthorization(options =>
{
options.FallbackPolicy = new AuthorizationPolicyBuilder()
.RequireAuthenticatedUser()
.Build();
});
}
虽然使用 @Configuration["TestApp:Settings:KeyVaultMessage"] 从视图页面访问 Azure 配置数据很容易,但我在 Startup.cs 中配置服务时如何访问?
我已阅读Configuration in ASP.NET Core。我理解以下内容:
- Azure App Configuration 和 Key Vault 是配置提供程序(如 appsettings、环境变量和命令行中提供的那些)
- “连接字符串前缀”下的部分是相关的,但没有代码示例
- 自定义配置提供程序下的部分详细说明了我的情况可能需要的选项构建
- “启动中的访问配置”和“Razor 页面中的访问配置”下的部分似乎与我使用的语法直接相关。但仍然让我想知道如何将我的字符串与它的标签分开,以便用作我的数据库应用程序的“DefaultConnection”。
任何建议将不胜感激。
【问题讨论】:
-
我添加了 'Console.WriteLine($"MyKey : {Configuration["TestApp:Settings:KeyVaultDbString"]}");'在 Startup.cs 中,并在 Visual Studio 的“运行您的代码”框中使用我的项目名称运行。这在控制台窗口中产生了正确的输出(我的数据库连接字符串)。我想这是使用它的方法。类似'Configuration.GetConnectionString("TestApp:Settings:KeyVaultDbString")));'在我的 ConfigureServices 方法中。似乎太容易了!
标签: c# asp.net-core configuration credentials azure-keyvault