c# - 为 ASP.NET Core MVC 和 EF Core 解决方案提供 Azure SQL DB 连接字符串
问题描述
我相信我正在遵循 Microsoft 推荐的方法,并且我拥有所需的组件,但不知道如何将它们组合在一起。
我正在使用 Azure 应用程序配置服务来存储密钥保管库密钥(以及其他配置设置),并使用密钥保管库服务来提供包含 Azure SQL Server 用户名/密码的数据库连接字符串)
我有以下单独的工作项目/解决方案(ASP.NET Core MVC):
- 具有 Azure SQL DB 功能的工作 Azure Web 应用程序,可输出 CRUD 和表数据
- 一个有效的 Azure Web 应用程序,使用 Azure 应用程序配置为密钥和密钥库输出字符串“秘密”
- 我已使用托管 ID 访问所有 Azure 资源
使用测试应用程序,我可以使用 3 个项目文件中的代码从我的 Azure 应用程序配置和 Key Vault 服务输出虚拟配置数据:
- 程序.cs
webBuilder.ConfigureAppConfiguration((context, config)
- 应用设置.json
"AzureAppConfigurationEndpoint": "https://xxxxxxxxxx.azconfig.io"
- /Views/~/razor 页面
@Configuration["TestApp:Settings:KeyVaultDbString"]
我的数据库应用程序使用这些文件中的代码访问数据库连接字符串:
- 启动.cs
public void ConfigureServices(IServiceCollection services)
- 应用设置.json
"DefaultConnection":"Server=tcp:xxxx.database.windows.net,1433;XXXXXXX"
我想升级我的数据库应用程序以使用测试应用程序提供的连接字符串配置值。因此计划是:
将测试应用 Program.cs 中的代码合并到 db app 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>();
});
});
但。此时我不知道如何访问["TestApp:Settings:KeyVaultDbString"]
Startup.cs 中的配置数据。提供"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"]
虽然使用在 Startup.cs 中配置服务时如何访问,但从视图页面访问 Azure 配置数据很容易?
我已阅读ASP.NET Core 中的配置。我理解以下内容:
- Azure App Configuration 和 Key Vault 是配置提供程序(如 appsettings、环境变量和命令行上提供的那些)
- “连接字符串前缀”下的部分是相关的,但没有代码示例
- 自定义配置提供程序下的部分详细说明了我的情况可能需要的选项构建
- “启动中的访问配置”和“Razor 页面中的访问配置”下的部分似乎与我使用的语法直接相关。但仍然让我想知道如何将我的字符串与它的标签分开,以便用作我的数据库应用程序的“DefaultConnection”。
任何建议,将不胜感激。
解决方案
在appsettings.json 中 创建以下内容:
{
"Data": {
},
"ConnectionStrings": {
"DefaultConnection": "Server=(localdb)\\MSSQLLocalDB;Database=db;Trusted_Connection=True;"
}
}
在Startup.cs 中提供相关的连接字符串。更新ConfigureServices方法:
var conn = Configuration.GetConnectionString("DefaultConnection");
在任何使用 Entity Framework Core 的 MVC 应用程序中,
DbContext
都使用方法中的依赖注入进行注入ConfigureServices
。启动类中也需要连接字符串。
要从 Startup 类中读取,
IConfiguration
需要一个对象,该对象可以从依赖注入中注入。要注入
Startup
类,开发人员可以使用构造函数或GetConnectionString
方法。有关更多详细信息,请参阅连接字符串:实体框架核心 和SO。
推荐阅读
- spring-boot - 如何在前端访问安全的 API?
- python - C# CNTK 如何替换/重塑输入层
- flutter - 在登录和仪表板屏幕之间导航的正确方法?
- encoding - Icecast 介绍 mp3 文件
- javascript - javascript中的多维数组数据形成问题
- javascript - 受控 Fluent UI Checkbox 组件的渲染不正确
- gradle - 使用dependsOn从另一个gradle文件调用任务时出错
- mongodb - MongoDB 仅过滤器(如果有)
- facebook - 如何使用 Graph AP 将文件上传到 Facebook Workplace
- html - 使用分离的图像/元素打印到 pdf