2017-09-04 5 views
1

コントローラー内で問題なくIDataProtectorを使用して保護しています。私はプロテクターを注入して使用することができます。コントローラー間でc#MVCのデータ保護で復号化を暗号化

IDataProtector _protector; 

    public HomeController(IDataProtectionProvider provider) 
    { 
     _protector = provider.CreateProtector(GetType().FullName); 
    } 

    public IActionResult Index() 
    { 
     Test test = new Test(); 
     test.originaltext = "1"; 
     test.encryptedtext = _protector.Protect(test.originaltext); 

     test.originaltext = _protector.Unprotect(test.encryptedtext); 

     return View(test); 
    } 

これは、私は、これは暗号化されたデータを渡すリンクを作成して、同じコントローラ上の別の作用

<a asp-controller="Home" 
    asp-action="GetKey" 
    asp-route-id="@Model.encryptedtext"> 
    Pass Key to getkey 
</a> 

にこれを渡すことができ、暗号化と「1」

を復号化の両方を示し私はGetKeyアクションで解読することができます。

public IActionResult GetKey(String id) 
    { 
     Test test = new Test();   
     test.encryptedtext = id; 

     test.originaltext = _protector.Unprotect(id); 
     return View(test); 
    } 

私はリンクを作成して別のコントローラに渡そうとします。

<a asp-controller="Key" 
    asp-action="GetKeyController" 
    asp-route-id="@Model.encryptedtext"> 
    Pass Key to other controller 
</a> 

それはエラー

System.Security.Cryptography.CryptographicException: The payload was invalid 

と私は見なければならない場所に上の任意の手がかりを失敗しましたか?

答えて

1

あなたが保護のために目的の文字列として現在のタイプのフルネームを提供インスタンス作成コール...

provider.CreateProtector(GetType().FullName) 

あなたの中に...

あなたが作成するプロテクターとdeprotectorが必要になります非常に同じ目的の文字列で一緒に作業する

+0

は、うん、まさにそれを見つけたが、あなたの迅速な対応に感謝します。 – user3749535

0

[OK]を、私は間違っていたことを確認した後すぐに。私はあなたがあなたのプロテクターを作成するときに、キーを使用する必要があることを理解didntの....

_protector = provider.CreateProtector("KeyHere"); 
+0

そのパラメータはドキュメント内の "目的の文字列"と呼ばれています...それはキーではありません...実際のキーはルート暗号キーから導出され、目的の文字列...復号化を別のシステムに移動して見ます他のルートキーのために失敗する...ドキュメントを参照してください... https://docs.microsoft.com/en-us/aspnet/core/security/data-protection/consumer-apis/purpose-strings – DarkSquirrel42

関連する問題