如何在 ASP.NET MVC 5 中使用“ErikEJ.EntityFramework.SqlServer”和 Azure KeyVault 实现 SQL Server 始终加密?

问题描述 投票:0回答:1

我有一个现有的 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 的选项。

entity-framework entity-framework-6 azure-keyvault always-encrypted
1个回答
0
投票

这是我能够使用 ASP.NET Web 应用程序和 EF6 从 Key Vault 配置和获取加密秘密值的方法,以使用“ErikEJ.EntityFramework.SqlServer”提供程序实现始终加密并与 Azure Key Vault 集成

第 1 步:设置 Azure Key Vault

  • 在 Azure 门户中创建 Azure Key Vault
  • 将新密钥(列加密密钥)添加到 Key Vault,该密钥将用于保护您的敏感数据。
  • 在 Azure Key Vault 中配置权限以允许您的 Web 应用程序访问密钥。分配必要的访问策略

第 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;
        }
    }
}

结果 enter image description here

© www.soinside.com 2019 - 2024. All rights reserved.