Luego de mucho batallar ya dimos con la solución de este dilema que tantos lectores de este sitio web presentan. Si quieres compartir algo más puedes aportar tu comentario.
Solución:
Descargo de responsabilidad: soy administrador de programas en Microsoft
Actualmente, Always Encrypted no es compatible con .NET Core. Está en nuestra hoja de ruta, todavía no tenemos un cronograma para ello.
Esto ahora es compatible. Vea las respuestas a continuación.
Always Encrypted ahora es compatible con .Net Core 3.1 LTS.
Debe usar el paquete nuget Microsoft.Data.SqlClient.AlwaysEncrypted.AzureKeyVaultProvider
Install-Package Microsoft.Data.SqlClient.AlwaysEncrypted.AzureKeyVaultProvider -Version 1.1.1
Asegúrese de tener una configuración de Keyvault.
PARA DEPURAR, su cuenta en VS debe tener suficientes derechos para acceder a la bóveda de claves. (Cuando se publica, la aplicación en sí debe tener suficientes derechos: consulte https://docs.microsoft.com/en-us/azure/key-vault/managed-identity) Es posible que los permisos Obtener y Listar por sí solos no sean suficientes.
Luego en program.cs :
using Microsoft.AspNetCore.Hosting;
using Microsoft.Azure.KeyVault;
using Microsoft.Azure.Services.AppAuthentication;
using Microsoft.Data.SqlClient;
using Microsoft.Data.SqlClient.AlwaysEncrypted.AzureKeyVaultProvider;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.Configuration.AzureKeyVault;
using Microsoft.Extensions.Hosting;
//namespaces etc omitted
public static IHostBuilder CreateHostBuilder(string[] args) =>
Host.CreateDefaultBuilder(args)
.ConfigureAppConfiguration((context, config) =>
var keyVaultEndpoint = GetKeyVaultEndpoint();
if (!string.IsNullOrEmpty(keyVaultEndpoint))
var azureServiceTokenProvider = new AzureServiceTokenProvider();
var keyVaultClient = new KeyVaultClient(
new KeyVaultClient.AuthenticationCallback(
azureServiceTokenProvider.KeyVaultTokenCallback));
config.AddAzureKeyVault(keyVaultEndpoint, keyVaultClient, new DefaultKeyVaultSecretManager());
SqlColumnEncryptionAzureKeyVaultProvider sqlColumnEncryptionAzureKeyVaultProvider = new SqlColumnEncryptionAzureKeyVaultProvider(new KeyVaultClient.AuthenticationCallback(
azureServiceTokenProvider.KeyVaultTokenCallback));
SqlConnection.RegisterColumnEncryptionKeyStoreProviders(customProviders: new Dictionary(capacity: 1, comparer: StringComparer.OrdinalIgnoreCase)
SqlColumnEncryptionAzureKeyVaultProvider.ProviderName, sqlColumnEncryptionAzureKeyVaultProvider
);
)
.ConfigureWebHostDefaults(webBuilder =>
webBuilder.UseStartup();
);
private static string GetKeyVaultEndpoint() => "https://YOURKEYVAULT.vault.azure.net/";
}
En StartUp.cs ConfigureServices:
using Microsoft.Data.SqlClient;
//Code omitted
services.AddDbContext(options =>
options.UseSqlServer(new SqlConnection(Configuration.GetConnectionString("EntitiesModel"))));
Asegúrese de que su cadena de conexión contenga el parámetro Configuración de cifrado de columna = Habilitado:
"ConnectionStrings":
"EntitiesModel": "Server=SOMESERVER.database.windows.net;Database=SOMEDB;Trusted_Connection=False;Encrypt=True;Integrated Security=False;
MultipleActiveResultSets=true;persist security info=True;user id=SOMEDBACCOUNT;password=SOMEPASSWORD;
Column Encryption Setting=enabled;"
Pequeño problema: si usó andamios de base de datos, asegúrese de que la cadena de conexión del modelo también tenga la configuración de cifrado de columna. (si no lo cambió, es estándar dentro de la clase DBModel después del scaffolding con una advertencia VS)
Esto debería ponerte en marcha…
Ahora es compatible con .NET Core 3.0 Preview 5, que proporciona un nuevo SqlClient compatible con Always Encrypted y más. Ver este comentario para más información.
Para el proveedor de Key Vault, debe usar Microsoft.Data.SqlClient.AlwaysEncrypted.AzureKeyVaultProvider en su lugar.
Si crees que ha sido de utilidad este artículo, nos gustaría que lo compartas con otros entusiastas de la programación y nos ayudes a difundir esta información.