0

私はwebjob(.Net 4.6)を配備しています。これはいくつかのURL文字列を暗号化し、電子メールで顧客に送信します。 .NET CoreのIDataProtectorをencrpytionに使用したので、webjob .net 4.6がそのライブラリをサポートしていなかったので、手動でDLLを参照しなければなりませんでした。 webjobで例えばSystem.Security.Cryptography.CryptographicException: 'キー{00000000-0000-0000-0000-000000000000}がキーリングに見つかりませんでした。

:電子メール内のリンク

http://test.com/Email/Agreement?n=CfDJ8AAAAAAAAAAAAAAAAAAAAAD96g09022UwEG-GyVftzkm-n2JuL1hmvL5HLyghXliIgJ_N014EBqBFfWjmdA&a=CfDJ8AAAAAAAAAAAAAAAAAAAAAALoq9IuMBZKozhzH3jRaHpyFE1wtXzQK3T_0RNuX9LsSVxPITWgU9ZR21jXLk3YGjt 

なり

IDataProtector protector = provider.CreateProtector("myProtector") 
http://test.com/Email/Agreement?n=" + protector.Protect(name) + "&a=" + protector.Protect(address) 

お客様が電子メールのURLリンクをクリックすると、クライアントアプリケーション(.Net Core 1.1)コントローラが、URL文字列を解読して契約ページをポップアップ表示します。

例:私はそれらを保護解除しようとしたとき

public EmailController(IDataProtectionProvider provider) 
{   
    _protector = provider.CreateProtector("myProtector"); 
} 
public IActionResult Agreement(string n, string a) 
{  
    var decryptName = _protector.Unprotect(n); 
    var decryptAddress = _protector.Unprotect(a); 
} 

しかし、私は次のエラーメッセージを取得しています:

System.Security.Cryptography.CryptographicException:「キー{00000000から0000を-0000-0000-000000000000}がキーリングに見つかりませんでした。

回答を検索したところ、Azure Blobストレージにキーを格納するようにData Protectionを構成できることがわかりました。このlinkは私に蒼空ブロブストレージにキーを永続化する方法を教えてくれます。

質問:

  1. Azureブロブストレージに鍵を格納以外の最善のアプローチは何ですか?
  2. 私が正しい道を歩いているなら、どうすればいいですか?
  3. 設定にStartup.csがないリンクに表示されているWebjobプロジェクトと同じ設定をするにはどうすればよいですか?

大変助かります。

答えて

2

蒼空ブロブストレージにキーを格納する以外の最良の方法はありますか?

あなたが提供したドキュメントに基づいて、ファイルシステム、Azure Redis、Azureストレージおよびレジストリにキーを格納することができました。レジストリはWebジョブ(Azure Web App)によってサポートされていないため。ファイルシステムを選択する場合、WebジョブとWebアプリケーションの間でキーを転送する必要もあります。 Azure RedisとAzure Storageは良いアプローチになります。

正しいトラックにいる場合はどうすればいいですか?

ここでは、Azure Storageにキーを保存する方法の詳細な手順を示します。

ステップ1 Azureストレージアカウントがない場合は作成する必要があります。

ステップ2、NuGetを使用してMicrosoft.AspNetCore.DataProtection.AzureStorageパッケージをインストールします。

ステップ3、次のコードを使用してDataProtectionを構成します。 SetApplicationNameメソッドを呼び出し、Webアプリケーションと同じアプリケーション名を使用する必要があります。

var storageAccount = CloudStorageAccount.Parse("put your azure storage connection string here"); 
var client = storageAccount.CreateCloudBlobClient(); 

var container = client.GetContainerReference("key-container"); 
container.CreateIfNotExistsAsync().GetAwaiter().GetResult(); 

services.AddDataProtection().SetApplicationName("myapplication") 
    .PersistKeysToAzureBlobStorage(container, "keys.xml"); 

ステップ4、コントローラでは、次のようにIDataProtectionProviderを使用できます。コンフィギュレーションのためのStartup.csを持っていないリンクに示すように、私はwebjobプロジェクトのために同じ設定を構成するにはどうすればよい

public class HomeController : Controller 
{ 
    private IDataProtector _protector; 
    public HomeController(IDataProtectionProvider provider) 
    { 
     _protector = provider.CreateProtector("test-purpose"); 
    } 

    public IActionResult Index() 
    { 
     string encryptedTExt = _protector.Protect("abcd"); 
     return Content(encryptedTExt); 
    } 
} 

ステップ1、次のDLLへの参照を追加する必要があります。

enter image description here

ステップ2は、以下のようIDataProtectorのラッパークラスを追加します。

public class EncryptService 
{ 
    IDataProtector _protector; 

    // the 'provider' parameter is provided by DI 
    public EncryptService(IDataProtectionProvider provider) 
    { 
     _protector = provider.CreateProtector("test-purpose"); 
    } 

    public string Protect(string text) 
    { 
     return _protector.Protect(text); 
    } 

    public string Unprotect(string encryptedText) 
    { 
     return _protector.Unprotect(encryptedText); 
    } 
} 

ステップ3、ServiceCollectionを使用してData Protectionサービスを構成します。 SetApplicationNameメソッドを呼び出す必要があり、はWebアプリケーションと同じアプリケーション名を使用する必要があることに注意してください。

ステップ4、その後、次のコードを使用してデータを暗号化または復号化することができます。

var encryptService = ActivatorUtilities.CreateInstance<EncryptService>(services); 
string text = encryptService.Protect("abcd"); 
+0

素晴らしい!アモールに感謝します。 – pavilion

関連する問題