簡體   English   中英

啟用列加密 Azure Function App v2 錯誤

[英]Enable Column Encryption Azure Function App v2 Error

目前有許多 Azure 函數在 V1 上運行並希望開始遷移到 v2,但是我遇到了通過 sqlstringbuilder 啟用列加密的問題。

如果我注釋掉啟用列加密屬性 function 執行良好並返回加密的數據。

我需要啟用列加密屬性,以便它返回已解密的數據。

#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”

我相信您必須使用 System.Data.SqlClient 版本 4.5.1,它沒有設置列加密的屬性:

在此處輸入圖像描述

您可以為更新的框架升級框架,或者您可以簡單地 append 連接字符串本身的設置:

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

另外檢查以下文檔以供進一步參考:

Azure Function - 此平台不支持 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

希望能幫助到你。

根據我的研究,如果我們想使用設置ColumnEncryptionSetting來啟用 Always Encrypted with。 net core,我們應該使用 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);
        }       

    }

在此處輸入圖像描述 在此處輸入圖像描述

如果您在開發 function 時遇到錯誤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>

在此處輸入圖像描述


此外,您還可以使用 ODBC 驅動程序。 ODBC 驅動程序支持始終加密。 例如

 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();
                }
            }

更多詳情,請參閱

從 .NET Core 2.1 使用 SQL 服務器的始終加密

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM