2017-07-28 49 views
0

我已經實現了TimeTriggerC#Azure函數以運行存儲過程插入使用列加密進行加密的表(始終加密,AzureKey保險庫作爲提供商)密鑰存儲提供程序不能設置多次(始終使用Azure功能加密)

對我來說,阻塞區域是我的函數在1次成功運行並且再次出錯多次。所以我得到的成功之路是一種罕見的情況下

我遇到的錯誤是

mscorlib程序:異常已通過調用的目標引發異常。 System.Data:密鑰存儲提供程序不能設置多次。

我做了這方面的一些研究它發生在該行

SqlConnection.RegisterColumnEncryptionKeyStoreProviders(providers); 

隨着功能

static void InitializeAzureKeyVaultProvider() 
{ 
    string clientId = ConfigurationManager.AppSettings["AuthClientId"]; 
    string clientSecret = ConfigurationManager.AppSettings["AuthClientSecret"]; 
    _clientCredential = new ClientCredential(clientId, clientSecret); 

    // Direct the provider to the authentication delegate 
    SqlColumnEncryptionAzureKeyVaultProvider azureKeyVaultProvider = new SqlColumnEncryptionAzureKeyVaultProvider(GetToken); 

    Dictionary<string, SqlColumnEncryptionKeyStoreProvider> providers = new Dictionary<string, SqlColumnEncryptionKeyStoreProvider>(); 
    providers.Add(SqlColumnEncryptionAzureKeyVaultProvider.ProviderName, azureKeyVaultProvider); 

    // register the provider with ADO.net 
    SqlConnection.RegisterColumnEncryptionKeyStoreProviders(providers); 
} 

當我試圖看起來更深入錯誤的根本原因,它會像

異常已被目標引發調用。 ---> System.InvalidOperationException:密鑰存儲提供程序不能多次設置爲 。在 System.Data.SqlClient.SqlConnection.RegisterColumnEncryptionKeyStoreProviders(IDictionary`2 customProviders)

正如我上面提到我以前Azure的主要跳馬我的密鑰存儲Provider.I正確註冊我的AD Keyvault並添加已註冊的應用程序到我的密鑰保管庫(訪問策略)。

爲什麼我面對這種不正常的行爲,像一次性成功和另一次失敗?

感謝您迴應,
Jayendran

+0

你在哪裏調用'InitializeAzureKeyVaultProvider()'方法? 它從錯誤消息中看出您不止一次這樣做。 – Max

回答

0

您可能正在運行InitializeAzureKeyVaultProvider()每個函數調用裏面。如果第一次工作,當這個App實例沒有執行初始化。

在下一次函數調用期間,實例被重用,所以初始化已經執行。但是您再次調用它,因此會出現重複的註冊錯誤。

要解決此問題,請在靜態構造函數中進行初始化,或者存儲標誌(static bool)是否已經初始化,如果爲true(並保證線程安全),則跳過初始化。

+1

更好的做法是在應用程序啓動時使用靜態構造函數或其他方法。像這樣一個靜態屬性的變異會讓你面對一個潛在的線程安全問題。 – Max

+0

@Mikhail:現在我已將初始化放在一個單獨的類中,並生成了一個DLL。因此,我可以將該DLL添加到我的項目引用中,並在我的啓動中調用。但不幸的是,它不工作。我的方式是否正確? – Jayendran

+0

@JayendranRosh應該工作。如果您遇到困難,請通過步驟重新提出問題,提出新問題。 – Mikhail

0

我遇到了來自進入事件中心的消息觸發的Azure功能的相同問題。

我的解決方案可能不是100%正確的,但我不確定在令牌(來自GetToken)過期後,向提供者的註冊是否會受到影響。所以我不會註冊,直到我第一次調用需要Azure密鑰保管庫/始終加密的SQL查詢。

try 
{ 
    cmd.ExecuteNonQuery(); 
} 
catch (System.ArgumentException ex) 
{ 
    if (ex.TargetSite.Name == "DecryptSymmetricKey" && ex.InnerException == null) 
    { 
        InitializeAzureKeyVaultProvider() //Register the Provider 
        cmd.ExecuteNonQuery(); // Try the query again. 
    } 
}