Recientemente me encontré con este problema con múltiples sitios IIS desplegados en un solo servidor (Windows 2008 R2). Nuestro entorno tiene cada sitio ejecutándose en diferentes grupos de aplicaciones, pero en algunos casos, a esos grupos se les puede asignar la misma identidad.
Nuestra aplicación crea una clave si no existe, y la coloca en un contenedor con un nombre basado en la identidad actual. El primer sitio implementado siempre funcionó, pero si desplegáramos otro sitio en otro grupo de aplicaciones con la misma identidad, el segundo fallaría.
Resulta que cuando se almacena la clave, Windows da acceso total al usuario "IIS APPPOOL \ AppPoolName", y no la identidad que hemos asignado al grupo.
Por lo tanto, nuestra solución fue dar el contenedor permisos explícitos a la identidad actual (esto es similar a la respuesta de @ WebMixer, la única diferencia está en la CryptoKeyAccessRule
):
CspParameters cspParams;
cspParams = new CspParameters(PROVIDER_RSA_FULL);
cspParams.KeyContainerName = CONTAINER_NAME;
cspParams.Flags = CspProviderFlags.UseMachineKeyStore;
cspParams.ProviderName = "Microsoft Strong Cryptographic Provider";
CryptoKeyAccessRule rule = new CryptoKeyAccessRule(System.Security.Principal.WindowsIdentity.GetCurrent(), CryptoKeyRights.FullControl, AccessControlType.Allow);
cspParams.CryptoKeySecurity = new CryptoKeySecurity();
cspParams.CryptoKeySecurity.SetAccessRule(rule);
pueden no aplicarse ya que soy ejecutando el mismo código en dos proyectos diferentes, pero con la misma cuenta de usuario. – LamonteCristo
¿Es esa la ubicación de Windows XP? "C: \ ProgramData \ Microsoft \ Crypto \ RSA \ MachineKeys" es la ubicación de Vista (y arriba), creo. – granadaCoder