2009-03-19 9 views
1

J'ai un Socket connecté que j'utilise pour obtenir des réponses d'en-tête HTTP. Si j'oublie l'authentification, tout fonctionne correctement (sauf si la page nécessite une authentification). Mais quand j'interviens dans ce code, il lance toujours une IOException sur la ligne AuthenticateAsClient. Le message est: de "Impossible de lire les données de la connexion de transport: La connexion a été fermée." J'ai essayé DefaultCredentials et DefaultNetworkCredentials.L'authentification Sockets échoue à l'aide de NegotiateStream

Des idées sur ce qui me manque? Qu'est-ce qui cause la fermeture de la connexion?

grâce

if (Authenticate) 
{ 

    NetworkStream clientStream = new NetworkStream(webSocket, false); 
    NegotiateStream authStream = new NegotiateStream(clientStream); 

    NetworkCredential netcred = CredentialCache.DefaultNetworkCredentials; 


    try 
    { 
     authStream.AuthenticateAsClient(netcred, 
      String.Empty, 
      ProtectionLevel.None, 
      TokenImpersonationLevel.Identification); 

     if (!authStream.IsAuthenticated) 
     { 
      Console.WriteLine("Authentication failed"); 
      ErrorText = "Authentication using default credentials failed"; 
      return (HttpStatusCode)(-1); 
     } 
    } 
    catch (Exception ex) 
    { 
     Console.WriteLine(ex.Message); 
     ErrorText = ex.Message; 
     return (HttpStatusCode)(-1); 
    } 
} 

Répondre

0

NegotiateStream n'effectue pas d'authentification HTTP:

Sur les systèmes Windows 95/98, Windows NT LAN Manager (NTLM) est le protocole utilisé pour l'authentification. Sur les autres plates-formes, le protocole Kerberos est utilisé pour l'authentification si le client et le serveur le prennent en charge; sinon NTLM est utilisé.

Jetez un oeil à la classe WebClient qui fournit un Credentials et une propriété ResponseHeaders.

+0

Je me connecte à un serveur interne qui utilise NTLM, donc cela devrait fonctionner. Je ne veux pas utiliser la classe WebClient car elle enveloppe WebResponse et WebRequest. J'essaie de rester de bas niveau avec les appels Sockets. –

+0

HTTP et NTLM ne fonctionnent pas ensemble, HTTP utilise l'authentification HTTP (de base ou condensée). Si vous faites du HTTP, vous devriez d'abord essayer de le faire fonctionner avec WebClient. Si j'ai mal lu votre question initiale et que vous devez utiliser NTLM, veuillez fournir plus d'informations/code. – dtb

+1

> HTTP et NTLM ne fonctionnent pas ensemble C'est faux. La plupart des intranets d'entreprise utilisent NTLM/Negotiate sur HTTP. Voir http://www.rfc-editor.org/rfc/rfc4559.txt – EricLaw