私はこの問題で今日私の髪を引き出しています。私は一連の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();
}
Wiresharkを実行しようとしましたか?これは、パケットキャプチャとして動作しますが、プロキシではありません。 NTLMのネゴシエーションを妨げずにNTLMネゴシエーションを確認できるようにする必要があります。 (NTLMSSPヘッダーの解読もかなりうまく機能します)。 –