5

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

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 la 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 
+0

Para que quede claro, ¿es el cliente.Credentials = línea que arroja la excepción u otra cosa? –

+0

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

+0

Interesante; ¿está utilizando una tienda de certificados o tiene algo criptográfico configurado? –

Respuesta

4

Muy bien, este es un poco incómodo - He tenido una mirada y el error se debe a la configuración de las ventanas .... en alguna parte.

La parte del código que está lanzando 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 es devolver un código de error, causando su excepción

Si está en un lugar de trabajo, es posible que desee hablar con su administrador sysadmin/network para ver si hay algo en sus políticas locales que pueda causar un error. De lo contrario, vería qué pasa si desactivas tu antivirus/deshabilitar el cortafuegos o activar cualquier otro software proxy de terceros.

Básicamente, cualquier cosa que anule la funcionalidad de red predeterminada. Además, vale la pena comprobar que tenga todas las últimas actualizaciones de Windows y que no tenga cualquier infección de virus o malware.

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

+0

Lo raro es que tenemos un programa independiente ejecutando .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 los demás. A menos que me falta una referencia a algo, no veo cómo dos funciones similares y la forma en que está escrita pueden diferir en la misma máquina. – Seb

+1

ahh espera, el indicador 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 esté ejecutando las mismas credenciales que su sitio web ASP.Net. Lo que debe verificar es que la cuenta que ASP.Net utiliza tiene el acceso adecuado, y que tanto el grupo de aplicaciones como el directorio virtual ejecutan las mismas credenciales. Además, ¿estás usando suplantación o algo? –

+0

No se está haciendo nada para solicitar la otra página donde se usan 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 el NetworkCredential o viceversa? – Seb

0

Esto debería funcionar en una consola de 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.

5

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

+3

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

Cuestiones relacionadas