8

更新:
この質問に到達したばかりの場合、一般的な要点は、プロキシ経由で HttpWebRequest を作成しようとしており、奇妙なプロキシ サーバーから 407 を取得していることです。IE、Firefox、Chrome はすべて、Adobe Air アプリケーションと同様に、プロキシのネゴシエーションに成功しています。Google Chrome Web インストーラーが実際に失敗することが重要な場合があり、オフライン インストーラーを使用する必要があります。

Ian のリンクのおかげで、次の段階に進むことができました。現在、トークンをプロキシに送り返していますが、第 3 段階が通過していないため、ユーザー名/パスワード ハッシュを含む要求が .NET によって送信されていないため、HTML が返されません。

私は使っている:

  • IE6 ユーザーエージェント
  • ウィンドウズ7
  • スキャンセーフ プロキシ
  • .NET 3.5

以下のログに相当する最新のコードは次のとおりです。

HttpWebRequest request = HttpWebRequest.Create("http://www.yahoo.com") as HttpWebRequest;
IWebProxy proxy = request.Proxy;
// Print the Proxy Url to the console.
if (proxy != null)
{
    // Use the default credentials of the logged on user.
    proxy.Credentials = CredentialCache.DefaultCredentials;
}
request.UserAgent = "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.2; .NET CLR 1.0.3705;)";
request.Accept = "*/*";

HttpWebResponse response = request.GetResponse() as HttpWebResponse;
Stream stream = response.GetResponseStream();

例外

WebException (407) 認証が必要です。

使用されているプロキシ

プロキシ クライアントはサーバー ルームにあるScansafeハードウェア デバイスであり、(NTLM で認証されると) HTTP トラフィックをサーバーに転送してトラフィックをフィルタリングします。

System.Net トレース出力

プロキシのネゴシエーションに成功した IE

ソリューション

私は実際には解決策を見つけていませんが、Feroze と Eric のおかげで回避策を見つけ、実際のプロキシ (構成ではなく) が主な問題であることを発見しました。.NET HttpWebRequest の実装、Windows 7、そしてもちろん、私たちのラックにある Scansafe ハードウェア クライアントです。しかし、MSDN のサポート リクエストがなければ、わかりません。

4

8 に答える 8

8

プロキシの認証情報を設定したい場合、リクエスト オブジェクトではなく request.Proxy オブジェクトに認証情報を設定するべきではありませんか?

http://msdn.microsoft.com/en-us/library/system.net.webproxy.credentials.aspx

また、NTLM/Negotiate 認証を正常に使用するには、HTTP/1.1 要求 (または技術的には Keep-Alive を使用した要求) を行う必要があることに注意してください。

(まだ見ていない場合は、Fiddler の「Auth」インスペクターが NTLM 認証 BLOB を分解します。)

于 2009-09-22T05:17:27.550 に答える
6

IEおよびHttpWebRequestセッションで送信されたNTLMBLOBをデコードするユーティリティを作成しました。

HttpWebRequestとIEを見ると、どちらもサーバーに56ビットと128ビットの暗号化を要求しています。これがHttpWebRequestを使用したセッションのダンプです

==== Type1 ----
Signature: NTLMSSP
Type: 1
Flags: E20882B7
NTLMSSP_NEGOTIATE_56
NTLMSSP_NEGOTIATE_KEY_EXCH
NTLMSSP_NEGOTIATE_128
RESERVED2
RESERVED3
RESERVED4
NTLMSSP_REQUEST_NON_NT_SESSION_KEY
NTLMSSP_TARGET_TYPE_DOMAIN
NTLMSSP_NEGOTIATE_OEM_DOMAIN_SUPPLIED
NTLMSSP_NEGOTIATE_DATAGRAM
NTLMSSP_REQUEST_TARGET
NTLM_NEGOTIATE_OEM
NTLMSSP_NEGOTIATE_UNICODE)
Domain :
Workstation:
==== Type2 ----
Signature: NTLMSSP
Type: 2
Flags: 201
NTLMSSP_NEGOTIATE_56
NTLMSSP_REQUEST_NON_NT_SESSION_KEY)
Context: D32FDDCB:63507CFA

IEからのダンプは次のとおりです。

==== Type1 ----
Signature: NTLMSSP
Type: 1
Flags: A208B207
NTLMSSP_NEGOTIATE_56
NTLMSSP_NEGOTIATE_KEY_EXCH
NTLMSSP_NEGOTIATE_128
NTLMSSP_REQUEST_NON_NT_SESSION_KEY
NTLMSSP_NEGOTIATE_EXTENDED_SESSIONSECURITY
NTLMSSP_TARGET_TYPE_SHARE
NTLMSSP_TARGET_TYPE_DOMAIN
NTLMSSP_NEGOTIATE_OEM_DOMAIN_SUPPLIED
NTLMSSP_NEGOTIATE_DATAGRAM
NTLMSSP_REQUEST_TARGET
NTLMSSP_NEGOTIATE_UNICODE)
Domain : XXXX.UK
Workstation: XXX-X31
==== Type2 ----
Signature: NTLMSSP
Type: 2
Flags: 201
NTLMSSP_NEGOTIATE_56
NTLMSSP_REQUEST_NON_NT_SESSION_KEY)
Context: D32FDDCB:63507CFA

IE / HttpWebRequestの両方で、64ビットと128ビットの両方のセキュリティを要求しています。ただし、windows7では、NTLMの128ビットセキュリティがデフォルトになっているため、これがないと認証は失敗します。サーバーの応答からわかるように、サーバーは64ビット暗号化のみをサポートしています。

次のリンクには、他の人が遭遇した同様の問題についての議論があります。 http://social.msdn.microsoft.com/Forums/en-US/ncl/thread/f68e8878-53e9-4208-b589-9dbedf851198

管理対象アプリの代わりにIEが機能する理由は、IEが実際にNTLMSSP_NEGOTIATE_SEAL|を要求しないためです。NTLMSSP_NEGOTIATE_SIGN。最終的に暗号化が必要になります。ただし、HttpWebRequestはSEAL|SIGNの両方を要求します。これには128ビットの暗号化が必要ですが、IEがNTLMSSPを初期化する方法(SEAL&SIGNなし)では、暗号化は必要ありません。したがって、IEは機能しますが、HttpWebRequestは機能しません。(上記のリンクを参照してください)

NTLMで64ビット暗号化を許可するようにセキュリティポリシーを変更すると、マネージコードアプリが機能すると思います。または、プロキシベンダーにNTLMの128ビット暗号化をサポートするよう依頼してください。

お役に立てれば。

于 2009-09-26T23:51:54.903 に答える
3

私は同様の問題を抱えていて、次のブログ投稿のヒントを使用して問題を解決しました。

http://blogs.msdn.com/jpsanders/archive/2009/03/24/httpwebrequest-webexcepton-the-remote-server-returned-an-error-407-proxy-authentication-required.aspx

于 2009-09-18T10:36:20.813 に答える
1

で次の設定を確認しますsecpol.msc。それは私たちの問題を修正しました。

Local Security Policy 
    Local Policies
        Security Options
            Network security: Minimum session security

に設定:

require 128 only for client. 

ここに画像の説明を入力してください

于 2013-03-05T16:44:08.210 に答える
0

これはどう:

        HttpWebRequest request = HttpWebRequest.Create("http://www.yahoo.com") as HttpWebRequest;
        WebProxy proxyObject = new System.Net.WebProxy("http://10.0.0.1:8080/", true); //whatever your proxy address is

        proxyObject.Credentials = CredentialCache.DefaultCredentials;
        request.Proxy = proxyObject;

        request.UserAgent = "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.2; .NET CLR 1.0.3705;)";
        request.Accept = "*/*";

        HttpWebResponse response = request.GetResponse() as HttpWebResponse;
        Stream stream = response.GetResponseStream();
于 2009-09-25T21:39:09.230 に答える
0

HttpWebRequest の User-Agent ヘッダーを、IE8 が設定しているのと同じ値に設定してみてください。

ユーザーエージェントが期待したものでない場合、サーバーは正しくチャレンジしないことがあります。

お役に立てれば。

于 2009-09-19T03:11:13.427 に答える
0

「CredentialCache」の内容に関連している可能性があります。代わりにこれを試してください:

proxy.Credentials = new NetworkCredential("username", "pwd", "domain"); 
于 2009-09-25T14:55:36.937 に答える
0

プロキシの割り当て方法ですか?

proxy.Credentials = CredentialCache.DefaultCredentials;

最後に HttpWebRequest でプロキシを使用したとき、次のように割り当てられました。

リクエストにプロキシを割り当てます:

request.Proxy.Credentials = Credentials.GetProxyCredentials();

呼び出し方法:

    public static ICredentials GetProxyCredentials()
    {
        return new NetworkCredential(AppConstants.Proxy_username, AppConstants.Proxy_password);
    }

web.config でプロキシを構成する

<system.net>
  <defaultProxy enabled="true">
    <proxy
      autoDetect="False"
      bypassonlocal="True"
      scriptLocation="http://www.proxy.pac"
      proxyaddress="http://proxy1.blah.com" />
  </defaultProxy>
</system.net>
于 2009-09-25T04:41:39.880 に答える