2011-11-07 27 views
0

私はこの問題で今日私の髪を引き出しています。私は一連のWebフォームを記入するために、一連のHTTP GETとPOSTを実行する社内アプリケーションを開発してきました。コードは、私がGET URIとPOST FormDataをデバッグするために使用していた、fiddler2を実行するときにうまく動作します。今私はfiddler2を実行していない、私は認証401エラーを取得します。私は比較するヘッダーを見ていますが、それはフィドラーを実行することができないと少し難しいです。NTLM v1認証はFiddler2と一緒にしか使用できません

基本的に私のコードは、URIにアクセスしてクッキーを保存することによって動作します。サイトへのアクセスはSSOによって制御され、サーバーは2003年にNTLMv1を使用したいと考えています。私がWindows 7クライアントで最初に持っていた問題は、Win7が128ビットをネゴシエートするのに対し、サーバーは64ビットしか話さず、認証は失敗する(最後の401)。 fiddler2を使って、ローカルマシンのグループポリシーを64ビットに設定すると、私は自分の仕事を完了することができました。私はその後、ソフトウェアをWebサービスに変え、今日、それが失敗するという問題があることを発見しました。私が前に言ったように、すべてのクライアントにフィダラー2をインストールして使用することができないので、私はフィディラー2を使ってうまく動作します。

まず、クッキーを保存する機能があります。次に、私はそのクッキーを使ってgetを実行する別の関数を持っています。最初の関数は常に失敗します。「リモートサーバーはエラーを返しました:(401)Unauthorized」

私は、不可能なことをしようとしていない。

おかげで、 アル

/// <summary> 
/// Function to get a cookie from a site providing the given site and credentials - this cookie then can be reused for subsequent calls 
/// </summary> 
/// <param name="credential">The NetworkCredential to access the site</param> 
/// <param name="Uri">The Uri of the site</param> 
/// <returns>A CookieContainer containing all needed cookies</returns> 
private CookieContainer GetCookie(NetworkCredential credential, string Uri) 
{ 
    HttpWebRequest req = (HttpWebRequest)HttpWebRequest.Create(Uri); 
    HttpWebResponse resp; 
    CookieContainer cookieJar = new CookieContainer(); 
    req.AllowAutoRedirect = true; 
    req.Credentials = credential; 
    req.CookieContainer = cookieJar; 
    resp = (HttpWebResponse)req.GetResponse();  // This line always fails with: The remote server returned an error: (401) Unauthorized. 
    return cookieJar; 
} 

/// <summary> 
/// Function to perform a HTTP GET 
/// </summary> 
/// <param name="cookieJar">A CookieContainer for keeping the reference of our sessions</param> 
/// <param name="credential">The Credentials to use to access the site</param> 
/// <param name="Uri">The Uri to GET</param> 
private void DoGet(CookieContainer cookieJar, NetworkCredential credential, string Uri) 
{ 
    HttpWebRequest req; 
    HttpWebResponse resp; 

    // Just grab the site uri where the cookie is stored 
    string[] UriParts = Uri.Split(new char[] { '/' }, StringSplitOptions.RemoveEmptyEntries); 
    Uri CookieUri = new Uri(UriParts[0] + "//" + UriParts[1]); 

    // Use cookie information to get first page of call entry 
    req = (HttpWebRequest)HttpWebRequest.Create(Uri); 
    req.CookieContainer = new CookieContainer(); 
    req.CookieContainer.Add(cookieJar.GetCookies(CookieUri)[0]); 
    req.AllowAutoRedirect = true; 
    req.Credentials = credential; 
    req.CookieContainer = cookieJar; 
    resp = (HttpWebResponse)req.GetResponse(); 
} 
+1

Wiresharkを実行しようとしましたか?これは、パケットキャプチャとして動作しますが、プロキシではありません。 NTLMのネゴシエーションを妨げずにNTLMネゴシエーションを確認できるようにする必要があります。 (NTLMSSPヘッダーの解読もかなりうまく機能します)。 –

答えて

0

私の解決策は、サーバー上でNTLMv1 64ビットを強制的に使用することでした。私が知っている人のための解決策ではありませんが、それは私たちのために働きます

1

は、私はまだ答えを知らないが、私はいくつかの違いはあるものの、同じ問題が発生しています。私も、フィドラー2を走らせることなく失敗するプロセスを持っています。チャンピオンのように働きます。まず、さまざまなWebサービスに接続し、生のSOAPメッセージをさまざまなWebサービスに送信するディスパッチャアプリケーションを用意し、応答を受信して​​データベースに戻します。いくつかのサービスについて、今や良いサービスを提供するために、これはアウト・オブ・ハウス・サービスです。プロセスはヒックアップするだけで実行されています。しかし、社内で開発されたばかりのWebサービスを導入したとき、私はまったく同じ問題を抱え始めました。

私が最初に疑ったのは、プロキシとして機能するフィドラーが、資格の問題を何とか解決していたことでした。これはそうかもしれないし、そうでないかもしれないが、それは良い場所のように思える。解決なし

IAsyncResult asyncResult = webRequest.BeginGetResponse(null, null); 

HttpWebResponse webResponse = (HttpWebResponse)webRequest.GetResponse(); 

:まず第一に、私はこれまでの両方でテストしました。また、私は解決せず、再び

webRequest.Credentials = CredentialCache.DefaultCredentials; 

webRequest.Credentials = CredentialCache.DefaultNetworkCredentials; 

を使用していました。私はあなたがNTLMv1の何かに乗っていると信じています。私はNTLMv1認証/認可の資格を何とか発行する必要があるかもしれないと考えています。

Microsoftのサイトは述べている:認証タイプでサポートされる値は、「NTLM」、「ダイジェスト」、「ケルベロス」であり、これは、暗闇の中でだけでショットです

The full story

を「交渉」 が、これはサーバー側の問題かもしれませんか? http://support.microsoft.com/kb/813834

関連する問題