2017-03-06 1 views
0

Je tente d'implémenter l'authentification NTLM par moi-même. Le problème est quand je tente d'envoyer le message de type 1 (NEGOTIATE_MESSAGE) l'application renvoie une exception:Etape par étape Authentification NTLM avec System.Net.Http.HttpClient

Une erreur est survenue lors de l'envoi de la demande.

Et

Exception levée: 'System.Runtime.InteropServices.COMException' dans mscorlib.ni.dll

informations WinRT: La demande de connexion a été refusée

ici est mon code:

byte[] type1Message = new byte[40] 
{ 
    // 'N', 'T', 'L', 'M', 'S', 'S', 'P', '\0' 
     0x4E, 0x54, 0x4C, 0x4D, 0x53, 0x53, 0x50, 0x00, 
    // Type 1 message 
     0x01, 0x00, 0x00, 0x00, 
    // Flags 
     0x97, 0x82, 0x08, 0xe2, 
    // Supplied Domain 
     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
    // Supplied Workstation 
     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
    // OS Version Structure 
     0x0A, 0x00, 0x39, 0x38, //0x00, 0x00, 0x00, 0x00, 
    // Os version uknown 
     0x00, 0x00, 0x00, 0x0f 
}; 

var _client = new HttpClient(); 
var request = new HttpRequestMessage(HttpMethod.Get, "http://localhost:60475/"); 
request.Headers.Add("Authorization", "NTLM " + Convert.ToBase64String(type1Message)); 
using (var response = await _client.SendAsync(request)) 
{ 
    if (response.IsSuccessStatusCode) 
    { 
     return; 
    } 
    else 
    { 

    } 
} 

Dans Fiddler je vois que la demande est envoyée et je recevrais la bonne réponse.

tête de demande:

GET http://localhost:60475/ HTTP/1.1 
Authorization: Negotiate TlRMTVNTUAABAAAAl4II4gAAAAAAAAAAAAAAAAAAAAAKADk4AAAADw== 
Host: localhost:60475 
Connection: Keep-Alive 

tête de réponse:

HTTP/1.1 401 Unauthorized 
Content-Type: text/html; charset=us-ascii 
Server: Microsoft-HTTPAPI/2.0 
WWW-Authenticate: Negotiate TlRMTVNTUAACAAAAHgAeADgAAAAVgorixp1F6S8OipIAAAAAAAAAAJgAmABWAAAACgA5OAAAAA9EAEUAUwBLAFQATwBQAC0ATQA1ADMAUgBNAE8ASAACAB4ARABFAFMASwBUAE8AUAAtAE0ANQAzAFIATQBPAEgAAQAeAEQARQBTAEsAVABPAFAALQBNADUAMwBSAE0ATwBIAAQAHgBEAEUAUwBLAFQATwBQAC0ATQA1ADMAUgBNAE8ASAADAB4ARABFAFMASwBUAE8AUAAtAE0ANQAzAFIATQBPAEgABwAIALEnZjh/ltIBAAAAAA== 
Date: Mon, 06 Mar 2017 13:40:29 GMT 
Content-Length: 341 
Proxy-Support: Session-Based-Authentication 

Ai-je oublié quelque chose?

Merci pour votre aide

Répondre

0

Ceci est une poignée de main, vous devez prendre le défi NTLM, utilisez son nonce, puis créez votre propre nonce, puis prendre le hachage de mot de passe et faire le calcul. Ce site est incroyable et le java dans l'annexe est facile à convertir en C# http://davenport.sourceforge.net/ntlm.html

+0

Salut, oui je sais. Le problème est que je ne peux pas obtenir la réponse, car l'application se bloque sur 'using (var response = await _client.SendAsync (request))'. –

+0

Je ne l'enverrais pas async, car il n'y a pas d'autres opérations sur lesquelles vous devez travailler en attendant. Je recommanderais le code synchrone. Voulez-vous dire que vous voyez la réponse dans fiddler, mais jamais dans votre code? – markgamache

+0

'Êtes-vous en train de dire que vous voyez la réponse dans fiddler, mais jamais dans votre code?' Oui –