¿Qué sucede exactamente cuando configuro LoadUserProfile del grupo IIS?

103

Me enfrenté al siguiente problema.

Ejecuto el siguiente código

var binaryData = File.ReadAllBytes(pathToPfxFile);
var cert = new X509Certificate2(binaryData, password);

en dos procesos. Uno de los procesos se ejecuta LOCAL_SYSTEMy allí este código tiene éxito. Otro se ejecuta dentro de IIS bajo una cuenta de usuario local que pertenece al grupo local "Usuarios" y allí obtengo la siguiente excepción:

System.Security.Cryptography.CryptographicException
Object was not found.
at System.Security.Cryptography.CryptographicException.ThrowCryptographicException(Int32 hr)
at System.Security.Cryptography.X509Certificates.X509Utils._LoadCertFromBlob(Byte[] rawData, IntPtr password, UInt32 dwFlags, Boolean persistKeySet, SafeCertContextHandle& pCertCtx)
at System.Security.Cryptography.X509Certificates.X509Certificate.LoadCertificateFromBlob(Byte[] rawData, Object password, X509KeyStorageFlags keyStorageFlags)
at System.Security.Cryptography.X509Certificates.X509Certificate2..ctor(Byte[] rawData, String password)
//my code here

Así que busqué en Google un poco y encontré esta respuesta a una pregunta similar. Intenté habilitar LoadUserProfilepara el grupo de aplicaciones y ahora funciona.

El problema es que no entiendo qué sucede exactamente cuando establezco LoadUserProfiley qué consecuencias podría tener. Quiero decir, si es algo "bueno", ¿por qué no está "activado" por defecto y por qué está ahí después de todo?

¿Qué sucede exactamente cuando configuro el LoadUserProfilegrupo IIS y qué consecuencias negativas puede tener?

diente filoso
fuente
6
Solo una ocurrencia tardía, si cargar el perfil de usuario es un problema para usted, puede cambiar la carga del certificado para new X509Certificate2(binaryData, password, X509KeyStorageFlags.MachineKeySet)que no necesite un perfil de usuario.
vcsjones
1
Si se ejecuta como ApplicationPoolIdentity, querrá usar lo new X509Certificate2(keyFilePath, keyFilePassword, X509KeyStorageFlags.MachineKeySet | X509KeyStorageFlags.EphemeralKeySet)que evita escribir la clave privada en la tienda y no requerirá privilegios administrativos en el servidor.
Nate

Respuestas:

117

Quiero decir, si es algo "bueno", ¿por qué no está "activado" de forma predeterminada y por qué, después de todo, está ahí?

IIS 6 nunca cargó perfiles de usuario. Asumiría que esto está desactivado de forma predeterminada para mantener el comportamiento constante, y un administrador debe optar por ello.

Intenté habilitar LoadUserProfile para el grupo de aplicaciones y ahora funciona.

Lo más probable es que esto se deba a que el proveedor de servicios criptográficos de Windows estaba intentando almacenar o cargar una clave para su certificado en el almacén de usuarios y, dado que no había un perfil disponible, no había un contexto criptográfico disponible. Tenga en cuenta que la Load User Profileconfiguración solo se aplica a las cuentas de usuario. Las cuentas de servicio como NETWORK SERVICE y ApplicationPoolIdentity tienen un manejo especial.

¿Qué sucede exactamente cuando configuro LoadUserProfile en el grupo IIS?

Bueno, el perfil de usuario está cargado. Esto incluye su almacén criptográfico, variables de entorno como% TEMP% y otras.

A lo que finalmente se reduce LoadUserProfilees a que IIS lo llama cuando se inicia AppPool.

¿Qué consecuencias negativas puede tener?

Puede romper la compatibilidad con versiones anteriores con una aplicación que se ejecutó en IIS 6, que no cargó el perfil de usuario. Se cargan las variables de entorno. Por ejemplo, cuando Cargar perfil de usuario es verdadero, la variable de entorno% TEMP% es C:\Users\AccountName\AppData\Local\Temp(por ejemplo). Cuando es falso, lo es C:\WINDOWS\Temp.

vcsjones
fuente
1
+1 para NETWORK SERVICE como identidad del grupo de aplicaciones, pero ApplicationPoolIdentity no fue exitoso para mí.
David d C e Freitas
3
"Puede romper la compatibilidad con versiones anteriores con una aplicación que se ejecutó en IIS 6, que no cargó el perfil de usuario". Supongo que también tiene implicaciones de rendimiento (el perfil debe cargarse; esto significa, por ejemplo, cargar la colmena de registro HKCU) y de seguridad (vector potencial más grande).
Sören Kuklau
1
¿Es posible configurar LoadUserProfile=trueen IIS y cambiar la ubicación de la carpeta temporal predeterminada% TEMP% desde C:\Users\C:\Users\AccountName\AppData\Local\Tempotro lugar? ejemplo "D: \ AppTempData"
Murali Murugesan
Murali Murugesan: ¿alguna vez recibió una respuesta a esta pregunta? Tengo el mismo problema. Quiero que se cambie el directorio Temp predeterminado.
VBAHole
1
Me encontré con esto hace años construyendo un servicio de back-end que llamaba a un servicio web remoto protegido por la autenticación de certificado de cliente X509. Debido a que los certificados personales se almacenan en el perfil de un usuario, al instalar el servicio, tuve que iniciar sesión en el servidor de destino como la cuenta de inicio de sesión del servicio, que crea un perfil de usuario, y luego instalar el certificado de cliente en el almacén de certificados de la cuenta de inicio de sesión. Después de eso, el certificado del cliente se cargaría en tiempo de ejecución.
Craig Boland