Error de NetworkCredential en ASP.NET

Estoy intentando acceder a una página web a través de ASP.NET usando la clase NetworkCredential. Sin embargo, sigo recibiendo una excepción con el siguiente mensaje System.Security.Cryptography.CryptographicException: The handle is invalid

A continuación se muestra mi código sobre cómo estoy tratando de llamar a la función. Cualquier ayuda es muy apreciada.

C #:

System.Net.WebClient client = new System.Net.WebClient();
client.Credentials = new System.Net.NetworkCredential("Admin", "Nimda");

Seguimiento de pila

[CryptographicException: The handle is invalid.
]

System.Security.SecureString.ProtectMemory() +154
   System.Security.SecureString.InitializeSecureString(Char* value, Int32 length) +170
   System.Security.SecureString..ctor(Char* value, Int32 length) +65
   System.Net.SecureStringHelper.CreateSecureString(String plainString) +6181188
   System.Net.NetworkCredential..ctor(String userName, String password) +64

preguntado el 10 de mayo de 11 a las 12:05

Para ser claros, ¿es la línea client.Credentials = la que arroja la excepción o algo más? -

Esa es la línea que arroja la excepción, sí. -

Interesante; ¿Está utilizando un almacén de certificados o tiene algo criptográfico configurado? -

Nada parecido. Solo intento acceder a una página web que requiere credenciales de usuario. -

¿Qué versión de .net y Windows es esta? -

3 Respuestas

Ok, esto es un poco incómodo, he echado un vistazo y el error se debe a la configuración de Windows ... en alguna parte.

La parte del código que genera una excepción es en realidad una llamada de interoperabilidad a una función en advapi32.dll, específicamente:

int status = Win32Native.SystemFunction040(this.m_buffer, (uint) (this.m_buffer.Length * 2), 0);
if (status < 0)
{
    throw new CryptographicException(Win32Native.LsaNtStatusToWinError(status));
}
this.m_encrypted = true;

Llamadas:

[ReliabilityContract(Consistency.WillNotCorruptState, Cer.Success), DllImport("advapi32.dll", CharSet=CharSet.Unicode, SetLastError=true)]
internal static extern int SystemFunction040([In, Out] SafeBSTRHandle pDataIn, [In] uint cbDataIn, [In] uint dwFlags);

Eso está devolviendo un código de error, causando su excepción.

Si está en un lugar de trabajo, es posible que desee hablar con su administrador de sistemas / personal de red para ver si hay algo en sus políticas locales que pueda causar una falla. De lo contrario, vería qué sucede si deshabilita su antivirus / deshabilita el firewall / apaga cualquier software proxy de terceros.

Básicamente, cualquier cosa que anule la funcionalidad de red predeterminada. Además, podría valer la pena comprobar que tiene las últimas actualizaciones de Windows y que dont tiene algún virus o infección de malware.

Lo siento, no puedo ser más específico, pero no creo que se trate de un error de programación .Net.

contestado el 10 de mayo de 11 a las 17:05

Lo extraño es que tenemos un programa independiente que ejecuta .NET 3.5 que se realiza en VB. Lo que estamos tratando de hacer es incorporar ese programa independiente en nuestro sitio web para que sea más accesible para otros. A menos que me falte una referencia a algo, no veo cómo dos funciones similares y la forma en que está escrito podrían diferir en la misma máquina. - seb

ahh, espera, la bandera 0, le dice a este método que encripte la memoria especificada en el mismo proceso. Si su VB está funcionando, es probable que no tenga las mismas credenciales que su sitio web ASP.Net. Lo que debe verificar es que la cuenta que ASP.Net está usando tenga el acceso adecuado y que tanto su grupo de aplicaciones como el directorio virtual estén ejecutando las mismas credenciales. Además, ¿estás usando suplantación de identidad o algo? - Russ Clarke

No se hace nada para solicitar la otra página en la que se utilizan las credenciales. Como se ve en el código anterior, creo el WebClient y creo la variable NetworkCredential. No va más allá de eso. ¿Hay algo que deba hacer para preparar el WebClient para permitir NetworkCredential o viceversa? - seb

Sí, lo que sugiero no son las credenciales que está especificando en su objeto Credential, sino las credenciales con las que se ejecuta el código. Si su ejecutable de VB funciona bien, es muy probable que no se ejecute con las mismas credenciales que su sitio web ASP.Net. Es posible que pueda probar esto ejecutando este código como un script de Power-Shell. - Russ Clarke

Entonces, ¿me está recomendando que escriba un script de power-shell y pase la información que necesito en el script desde la página ASP.NET? - seb

Acabo de encontrar el mismo problema. Estaba sucediendo localmente en el servidor de desarrollo ASP.NET en VS 2010. Cuando ejecuté la aplicación en mi Windows 7 / IIS 7, funcionó bien. ¡Espero que esto ayude!

Respondido el 28 de Septiembre de 11 a las 09:09

Para mí, detuve el servidor de desarrollo y reinicié el depurador (que también reinicia el servidor de desarrollo) en VS 2010, luego funcionó bien. - Finster

Esto debería funcionar en una consola PowerShell estándar:

Add-Type -AssemblyName System.Net
$client = New-Object System.Net.WebClient
$netc = New-Object System.Net.NetworkCredential("Admin", "Nimda")
$client.Credentials = $netc

Será interesante ver si esto genera el mismo error de identificador no válido.

Editar: Disculpas, hubo un error tipográfico en la segunda línea.

contestado el 10 de mayo de 11 a las 18:05

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.