2017-03-06 9 views
0

自分でNTLM認証を実装しようとしています。要求を送信しながらSystem.Net.Http.HttpClientを使用したステップバイステップのNTLM認証

エラーが発生しました:私はタイプ1メッセージ(NEGOTIATE_MESSAGE)アプリは例外をスローを送信しようとすると、 問題があります。

そして

例外がスローされた: 'System.Runtime.InteropServices.COMException' をmscorlib.ni.dllに

WinRTの情報:ログイン要求が拒否された

ここ私のコードは:

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 
    { 

    } 
} 

フィドラーで私はそのリクエストが送信されていることを知り、正しい答えを受け取るでしょう。

要求ヘッダー:

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

レスポンスヘッダ:

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 

は、私が何かを忘れてしまったことがありますか?

はあなたの助け

答えて

0

これは握手でいただきありがとうございます、あなたは、NTLMチャレンジに取るそのnonceを使用して、独自のナンスを作成し、パスワードハッシュを取る必要があると計算を行います。このサイトは素晴らしいですし、付録のJavaはCに変換するのが簡単です# http://davenport.sourceforge.net/ntlm.html

+0

こんにちは、私は知っています。問題は、アプリケーションが '(var response = await _client.SendAsync(request))を使用してクラッシュするため、応答を取得できないということです。 –

+0

私はそれを待っている間に作業する必要がある他の操作がないので、非同期を送信したいと思います。私は同期コードをお勧めしたいと思います。あなたは、あなたがフィドラーでの応答を見ているが、決してあなたのコードではないと言っていますか? – markgamache

+0

'あなたはフィドラーで応答を見ているが、決してあなたのコードではないと言っているのですか? ' はい –