Включить функцию шифрования столбца Azure Function App v2 Ошибка - PullRequest
0 голосов
/ 03 ноября 2019

В настоящее время имеется ряд функций Azure, работающих на V1 и ожидающих начала перехода на v2, однако у меня возникают проблемы с включением шифрования столбцов с использованием sqlstringbuilder.

Если я закомментирую свойство шифрования столбца включения, функция выполняется нормально и возвращает зашифрованные данные.

Мне нужно включить свойство шифрования столбца, чтобы оно возвращало дешифрованные данные.

#load "Serialize.csx"

#r "System.Configuration"
#r "System.Data"
#r "Newtonsoft.Json"

using System.Configuration;
//using System.Data.SqlClient;
using System.Threading.Tasks;
using System.Net;
using Newtonsoft.Json;
using System.Text;

using System;
using System.Collections.Generic;
using System.Data;
using System.Data.SqlClient;
using System.Globalization;
using System.Configuration;
//using Microsoft.Data.SqlClient

public static async Task<HttpResponseMessage> Run(HttpRequestMessage req, TraceWriter log)
{

 string connectionString = @"Data Source = #####################;

SqlConnectionStringBuilder connStringBuilder = new SqlConnectionStringBuilder(connectionString);


// THIS LINE IS CAUSING THE ERROR
connStringBuilder.ColumnEncryptionSetting = SqlConnectionColumnEncryptionSetting.Enabled;

connectionString = connStringBuilder.ConnectionString;



string json =  " ";


using (SqlConnection conn = new SqlConnection(connectionString))
{
     conn.Open();

     SqlCommand cmd = new SqlCommand();
     SqlDataReader dataReader;

     cmd.CommandText = "SELECT * FROM Encrypted5";
     cmd.Connection = conn;

     dataReader = cmd.ExecuteReader();

     var r = Serialize(dataReader);

     json =  JsonConvert.SerializeObject(r, Formatting.Indented); 


     conn.Close();
}


return new HttpResponseMessage(HttpStatusCode.OK) 
{
    Content = new StringContent(json, Encoding.UTF8, "application/json")
};

}

Результирующие сообщения об ошибках при включении:

2019-11-02T21: 30: 29.124 [Ошибка] run.csx (29,19): ошибка CS1061: «SqlConnectionStringBuilder» не содержит определения для «ColumnEncryptionSetting» и метода расширения «ColumnEncryptionSetting»можно найти первый аргумент типа 'SqlConnectionStringBuilder' (отсутствует директива using или ссылка на сборку?)

2019-11-02T21: 30: 29.295 [Ошибка] run.csx (29,45)): ошибка CS0103: имя 'SqlConnectionColumnEncryptionSetting' не существует в текущем контексте

Ответы [ 2 ]

1 голос
/ 05 ноября 2019

Согласно моим исследованиям, если мы хотим использовать настройку ColumnEncryptionSetting, чтобы включить Always Encrypted with. Чистое ядро, мы должны использовать SDK Microsoft.Data.SqlClient. Более подробную информацию можно найти в блоге и выпуске . Например, Мой код

 public static class Function1
    {
        [FunctionName("Function1")]
        public static async Task<IActionResult> Run(
            [HttpTrigger(AuthorizationLevel.Anonymous, "get", "post", Route = null)] HttpRequest req,
            ILogger log)
        {
            string connectionString = @"";

            SqlConnectionStringBuilder connStringBuilder = new SqlConnectionStringBuilder(connectionString);
            connStringBuilder.ColumnEncryptionSetting = SqlConnectionColumnEncryptionSetting.Enabled;

            string str = "";
            using (SqlConnection connection = new SqlConnection(connStringBuilder.ConnectionString))
            {
                connection.Open();
                string sql = "select * from dbo.Student";
                using (SqlCommand command = new SqlCommand(sql, connection))
                {
                    using (SqlDataReader reader = command.ExecuteReader())
                    {
                        while (reader.Read())
                        {
                            str += reader.GetString(0) + "  " + reader.GetString(1) + "\n";
                        }
                    }
                }
            }

            return
             (ActionResult)new OkObjectResult(str);
        }       

    }

enter image description here enter image description here

Если при разработке функции вы встретите ошибку Microsoft.Data.SqlClient is not supported on this platform. Пожалуйста, добавьте следующий скрипт в файл csproj. Для получения более подробной информации, пожалуйста, обратитесь к документу

<Target Name="PostBuild" AfterTargets="PostBuildEvent">
  <Exec Command="copy $(OutDir)$(ProjectName).deps.json $(OutDir)bin\function.deps.json" />
</Target>
<Target Name="PostPublish" BeforeTargets="Publish">
  <Exec Command="copy $(PublishDir)$(ProjectName).deps.json $(PublishDir)bin\function.deps.json" />
  <Exec Command="move $(PublishDir)\runtimes $(PublishDir)\bin" />
</Target>

enter image description here


Кроме того, вы также можете использовать драйвер ODBC,Драйвер ODBC поддерживает Always Encrypted. Например,

 using (var connection = new OdbcConnection(
                "Driver={ODBC Driver 17 for SQL Server};;Server={server name};Trusted_Connection=yes;ColumnEncryption=Enabled;Database={DBname};"))
            {
                using (var cmd = new OdbcCommand("", connection))
                {
                    connection.Open();
                    Console.WriteLine("Connected");
                    Console.WriteLine("SSN: " + Convert.ToString(cmd.ExecuteScalar()));
                    Console.ReadLine();
                    connection.Close();
                }
            }

Более подробная информация приведена в

Использование Always Encrypted of SQL Server из .NET Core 2.1

https://docs.microsoft.com/en-us/sql/connect/odbc/using-always-encrypted-with-the-odbc-driver?view=azuresqldb-current

0 голосов
/ 05 ноября 2019

Я считаю, что вы должны использовать System.Data.SqlClient с версией 4.5.1, у которой нет свойства для настройки шифрования столбца:

enter image description here

Либо вы можете обновить фреймворк для обновленного, либо вы можете просто добавить параметр в самой строке подключения:

string connectionString = "Data Source=server63; Initial Catalog=Clinic; Integrated Security=true; Column Encryption Setting=enabled";
SqlConnection connection = new SqlConnection(connectionString);

Дополнительно проверьте следующий документ для справки:

Функция Azure - System.Data.SqlClient не поддерживается на этой платформе

https://docs.microsoft.com/en-us/dotnet/api/system.data.sqlclient.sqlconnectionstringbuilder.columnencryptionsetting?view=netframework-4.8&viewFallbackFrom=netframework-4.5.1

https://docs.microsoft.com/en-us/sql/relational-databases/security/encryption/develop-using-always-encrypted-with-net-framework-data-provider?view=sql-server-ver15

Надеюсь, это поможет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...