El constructor RSACryptoServiceProvider (RSACryptoServiceProvider) se bloquea en .NET 3.5 para ciertos nombres de clave

Si observa el código que aparece a continuación, no hace nada más que crear una nueva instancia de unRSACryptoServiceProvider. El nombre del contenedor de clave se inicializa desde una propiedad que crea un nombre basado en varios parámetros. He añadido valores codificados en este código de demostración.

El código se ejecuta en una instalación de servidor de Windows 2008 R2 y ha funcionado durante meses con un valor constante que se devuelve para el nombre del contenedor de claves.

Hace algunos días, el código dejó de funcionar y nos enfrentamos a la excepción a continuación. El uso del nombre del contenedor de claves que se ha utilizado durante meses ya no funciona. El servidor se ha reiniciado, IIS se ha reiniciado, no ha sido un éxito. Sólo después de cambiar el nombre de la clave ha comenzado a funcionar de nuevo.

¿Alguien puede explicar por qué sucede esto y cómo solucionarlo? Por lo que puedo ver, este código no crea ningún objeto persistente. ¿Por qué seguiría fallando después de un reinicio? De MSDN (http://msdn.microsoft.com/de-de/library/ca5htw4f.aspx) leí que el constructor "el constructor crea o reutiliza un contenedor de clave especificado usando el campo KeyContainerName". Hace el"reutilizar"es decir, está guardando en caché las cosas en algún lugar y al hacerlo se bloquea y ahora está bloqueado con una versión en caché corrupta. También tenga en cuenta que el mismo nombre de clave todavía se usa en muchas otras máquinas, sin problemas en ninguna parte.

Esta es la línea que se está estrellando:

using ( RSACryptoServiceProvider rsa = new RSACryptoServiceProvider( this.oCspParameters ) )
{
}

Estos son los parámetros Csp utilizados:

private readonly CspParameters oCspParameters = new CspParameters
{
  Flags = CspProviderFlags.UseMachineKeyStore,
};

this.oCspParameters.KeyContainerName = oProfile.KeyName;

Y ese es el nombre clave:

public string KeyName
{
    get
    {
        return string.Format( "API-{0}-v{1}", "TestClient", "1.0.0.0" );
    }
}

Y finalmente la excepción:

CryptographicException: An internal error occurred.
Service Operation: ISessionService.Identify #f173250b-d7ac-45d5-98ed-7fffcf37d95a
at System.Security.Cryptography.Utils.CreateProvHandle(CspParameters parameters, Boolean randomKeyContainer)
at System.Security.Cryptography.Utils.GetKeyPairHelper(CspAlgorithmType keyType, CspParameters parameters, Boolean randomKeyContainer, Int32 dwKeySize, SafeProvHandle& safeProvHandle, SafeKeyHandle& safeKeyHandle)
at System.Security.Cryptography.RSACryptoServiceProvider.GetKeyPair()
at System.Security.Cryptography.RSACryptoServiceProvider..ctor(Int32 dwKeySize, CspParameters parameters, Boolean useDefaultKeySize)

Respuestas a la pregunta(2)

Su respuesta a la pregunta