2

Azureには、プロダクション版とプロダクション版の2つのWebアプリケーションが配置されています。ある時点で.Net CryptographicException Azureの "Object already exists"

ウェブサイトは、以下のコードを使用して、RSAキーをホストするコンテナを作成します。

// ----------------------------- 
// Part 1 : Initialize csp params 
// ----------------------------- 
const int PROVIDER_RSA_FULL = 1; 
const string CONTAINER_NAME = "OurKeyContainer"; 
CspParameters cspParams; 
cspParams = new CspParameters(PROVIDER_RSA_FULL); 
cspParams.KeyContainerName = CONTAINER_NAME; 
cspParams.Flags = CspProviderFlags.UseMachineKeyStore; 
cspParams.ProviderName = "Microsoft Strong Cryptographic Provider"; 

// -------------------------------------------------- 
// Part 2 : A try to set folder access rights to "everyone" 
// -------------------------------------------------- 
// http://whowish-programming.blogspot.fr/2010/10/systemsecuritycryptographycryptographic.html 
// http://stackoverflow.com/questions/5013881/c-sharp-how-do-i-get-the-everybody-user 
var sid = new SecurityIdentifier(WellKnownSidType.WorldSid, null); 
var rule = new CryptoKeyAccessRule(sid, CryptoKeyRights.FullControl, AccessControlType.Allow); 
cspParams.CryptoKeySecurity = new CryptoKeySecurity(); 
cspParams.CryptoKeySecurity.SetAccessRule(rule); 

return new RSACryptoServiceProvider(cspParams); 

問題は、このコードは唯一のウェブサイトの一つ、最初に実際に発売された1のために働くということです。 2つ目はCryptographicException "Object already exists"を投げました。

グーグルでは、キーコンテナにアクセスできないWebサイトを実行しているユーザーが原因であるようですが、残念ながら推奨されている修正(上記のコード2で実装されています)は機能しません。

アイデアやアドバイスはありますか?

Riana

+0

あなたのアイデンティティのための[RSA暗号化キーへの付与リードアクセス](https://msdn.microsoft.com/en-us/library/2w117ede.aspx#Y898)しようとしていますKUDU経由でWebアプリケーションに失敗しましたか? Aspnet_regiis.exeファイル[ここ](https://msdn.microsoft.com/en-us/library/k6h9cz8h.aspx)の場所が見つかりました。 –

+0

こんにちはブルースとあなたの応答に感謝します。あなたが送ったURLを読みましたが、aspnet_regiisコマンドはAzureコンソールやKuduによって認識されません。 –

+0

.NET Frameworkバージョン4(32ビットシステム)の場合は、DirをD:¥Windows¥Microsoft.NET¥Framework¥v4.0.30319に変更し、.NET Frameworkバージョン4(64ビットシステム) KUDUを介してあなたのディレクトリを 'D:\ Windows \ Microsoft.NET \ Framework64 \ v4.0.30319'に変更することができます。 –

答えて

2

おかげで、私はこの問題は、あなたが基本的には同じ名前で2回マシン広いコンテナを作成しようとしているということだと思います。私はpre-prodprodの環境が同じマシンにあると仮定しています。これは、おそらくApp Serviceの配備スロットと同じですか?私は少なくともこの設定であなたの問題を再現することができます。私が推測するのと同じ状況を生み出すことができるいくつかの他の設定がありますが、これが最も可能性があります。

あなたは異なる結果を生成します。この設定で変更することができる3つのものがあります:私たちはできるアイデンティティのために

  • アイデンティティのアクセスを許可する
  • コンテナストア
  • コンテナ名

は、 Everyone(試したとおり)か、WindowsIdentityから入手できるCurrentのいずれかを使用してください。

private IdentityReference GetWindowsIdentity() 
    { 
     return System.Security.Principal.WindowsIdentity.GetCurrent().User; 
    } 

    private IdentityReference GetEveryoneIdentity() 
    { 
     return new SecurityIdentifier(WellKnownSidType.WorldSid, null); 
    } 

コンテナストアはどちらかmachine wideまたはちょうど現在のユーザーのために

// machine wide store 
var cspParams = new CspParameters(PROVIDER_RSA_FULL) 
{ 
    ... 
    Flags = CspProviderFlags.UseMachineKeyStore; 
    ... 
}; 

// default store 
var cspParams = new CspParameters(PROVIDER_RSA_FULL) 
{ 
    ... 
    Flags = CspProviderFlags.UseDefaultKeyContainer; 
    ... 
}; 

、店舗名の私たちは、何かを選択することができますあなたのケースでは、あなたが同じことを選択したが、我々はその何かを設定することができますすることができ

KeyContainerName = "OurKeyContainer", 

    KeyContainerName = $"OurKeyContainer-{identity}", 

異なる組み合わせが異なる結果を生成しますだけでなく、アイデンティティのためにユニークです

みんなのアイデンティティは、機械広い店舗は、同じコンテナ名は、System.Security.Cryptography.CryptographicException: Object already exists.

みんなのアイデンティティ、機械広い店舗、

みんなのアイデンティティOKアイデンティティあたりのコンテナ、ユーザーストアとスロットのいずれかに失敗します同じコンテナ名System.Security.Cryptography.CryptographicException: The system cannot find the file specified.

みんなのアイデンティティ、ユーザーストア、アイデンティティあたりのコンテナとスロットの両方で失敗 OK

現在のアイデンティティは、機械広い店舗は、同じコンテナ名は、System.Security.Cryptography.CryptographicException: Object already exists.

現在のアイデンティティ、機械広い店舗、

現在のアイデンティティOKアイデンティティあたりのコンテナとスロットのいずれかに失敗しますユーザストア、同じコンテナ名両方のスロットで失敗するSystem.Security.Cryptography.CryptographicException: The system cannot find the file specified.

Curr ENTアイデンティティ、ユーザーストアは、アイデンティティあたりのコンテナは、問題を修正する環境に固有のものを含めるようにコンテナの名前を変更し、要約し、System.Security.Cryptography.CryptographicException: The system cannot find the file specified.ので

とスロットの両方で失敗します。それはアイデンティティである必要はありません(ただし、あなたが実行しているアプリケーションサービスごとに1つのアイデンティティが得られるので、それはかなり安全です)。アプリケーションにENVIRONMENT VARIABLEとして設定すると、環境の名前になる可能性がありますサービスを選択し、それぞれpre-prodprodに設定されていることを確認します。

Here is the playaround code to test it

+0

こんにちは、すべてのテストをする時間を取ってくれてありがとう!私はちょうど使用している可能性の欠点 –

+0

他のソースからそれらを使用する必要があるかどうかに依存しますか?私は良いセパレータが環境ごとにあると思います。どのような不利な点があるかわかりません。コンテナをどのように使用しているのか、あなたが保管しているものについてはたくさん書いていますが、現時点では、環境/マシンキーごとに1つのコンテナを持つことには本当に不利な点があります。 – yoape

関連する問題