我有一个现有的 ASP.NET MVC 5 Web 应用程序,它使用 Entity Framework 6 并面向 .NET Framework 4.7.2。我想使用“ErikEJ.EntityFramework.SqlServer”提供程序(该提供程序利用 Microsoft.Data.SqlClient)实现 SQL Server Always Encrypted,并将其与 Azure KeyVault 集成以实现安全密钥管理。
我想知道实现这一目标的分步过程。具体来说,我需要有关如何配置“ErikEJ.EntityFramework.SqlServer”提供程序、设置 Azure KeyVault 以及更新我的应用程序代码以与 Always Encrypted 无缝协作的指导。
任何帮助或资源指示将不胜感激。谢谢!
我尝试安装提供程序并按照此处记录的说明进行操作 https://github.com/ErikEJ/EntityFramework6PowerTools/blob/community/src/ErikEJ.EntityFramework.SqlServer/readme.md。我无法在此 Web 应用程序中找到配置 KeyVault 的选项。
这是我能够使用 ASP.NET Web 应用程序和 EF6 从 Key Vault 配置和获取加密秘密值的方法,以使用“ErikEJ.EntityFramework.SqlServer”提供程序实现始终加密并与 Azure Key Vault 集成
第 1 步:设置 Azure Key Vault
第 2 步:更新 NuGet 包 在您的项目中,确保安装了以下 NuGet 包:
Microsoft.Data.SqlClient
EntityFramework
(EF6)ErikEJ.EntityFramework.SqlServer
第 3 步:更新实体框架和连接字符串配置 在你的
web.config
配置实体框架以使用“ErikEJ.EntityFramework.SqlServer”提供程序:
<entityFramework>
<providers>
<provider invariantName="ErikEJ.EntityFramework.SqlServer" type="ErikEJ.EntityFramework.SqlServer.SqlProviderServices, ErikEJ.EntityFramework.SqlServer" />
</providers>
</entityFramework>
更新连接字符串以使用 Key Vault 密钥进行数据库连接。
<connectionStrings>
<add name="MyDbContext"
connectionString="Server=myserver.database.windows.net;Database=mydb;User ID=myuser;Password=YourSecretFromKeyVault;Encrypt=True;TrustServerCertificate=False;Connection Timeout=30;"
providerName="System.Data.SqlClient" />
</connectionStrings>
将
"YourSecretFromKeyVault"
替换为您存储在 Azure Key Vault 中的机密名称。
第 4 步:在实体框架中配置始终加密
using System.Data.Entity;
using ErikEJ.EntityFramework.SqlServer;
public class MyDbContext : DbContext
{
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
modelBuilder.HasColumnEncryptionKey("YourColumnEncryptionKey", SqlColumnEncryptionCspProvider.ProviderName);
}
}
将
"YourColumnEncryptionKey"
替换为您在 SQL Server 中创建的列加密密钥的名称。
第 5 步:创建用于 Key Vault 访问的助手 创建一个帮助程序类来访问 Azure Key Vault 中的机密
using Microsoft.Azure.KeyVault;
using Microsoft.Azure.Services.AppAuthentication;
using System;
public class KeyVaultHelper
{
private static readonly string KeyVaultEndpoint = "https://your-keyvault-name.vault.azure.net/";
private static readonly KeyVaultClient KeyVaultClient;
static KeyVaultHelper()
{
var azureServiceTokenProvider = new AzureServiceTokenProvider();
KeyVaultClient = new KeyVaultClient(
new KeyVaultClient.AuthenticationCallback(azureServiceTokenProvider.KeyVaultTokenCallback));
}
public static string GetSecret(string secretName)
{
try
{
var secretBundle = KeyVaultClient.GetSecretAsync(KeyVaultEndpoint, secretName).Result;
var secretValue = secretBundle.Value;
// Print the retrieved secret to the console
Console.WriteLine($"Key Vault Secret": {secretValue}");
return secretValue;
}
catch (Exception ex)
{
Console.WriteLine($"Error retrieving secret: {ex.Message}");
throw;
}
}
}
结果