System.Net.WebClientはWindows認証では機能しません
質問
WinFormsアプリケーションでSystem.Net.WebClientを使用して、Windows認証を持つIIS6サーバーにファイルをアップロードしようとしています。 「認証」メソッドのみ。
WebClient myWebClient = new WebClient();
myWebClient.Credentials = new System.Net.NetworkCredential(@"boxname\peter", "mypassword");
byte[] responseArray = myWebClient.UploadFile("http://localhost/upload.aspx", fileName);
「リモートサーバーからエラーが返されました:(401)Unauthorized」というメッセージが表示されますが、実際には401.2です
クライアントとIISの両方が同じWindows Server 2003 Devマシン上にあります。
Firefoxでページを開き、コードと同じ正しい資格情報を入力しようとすると、ページが表示されます。 ただし、IE8を使用すると、同じ401.2エラーが発生します。
ChromeとOperaを試してみましたが、どちらも動作します。
IEのインターネットオプションで「統合Windows認証を有効にする」を有効にしています。
セキュリティイベントログには失敗の監査があります:
Logon Failure:
Reason: An error occurred during logon
User Name: peter
Domain: boxname
Logon Type: 3
Logon Process: ÈùÄ
Authentication Package: NTLM
Workstation Name: boxname
Status code: 0xC000006D
Substatus code: 0x0
Caller User Name: -
Caller Domain: -
Caller Logon ID: -
Caller Process ID: -
Transited Services: -
Source Network Address: 127.0.0.1
Source Port: 1476
Process MonitorとFiddlerを使用して調査しましたが、役に立ちませんでした。
なぜこれはサードパーティのブラウザで機能するのにIEやSystem.Net.WebClientでは機能しないのですか?
解決
同様の問題があります。統合/ NTLMセキュリティは、マシン名またはローカルホストでホストにアクセスしている場合にのみ機能します。実際、これは「リフレクション攻撃」から保護するように設計されたWindowsの[不十分な]ドキュメント機能です。
基本的に、サーバーにアクセスしようとしているマシン上にレジストリキーを作成し、ヒットしようとしているドメインをホワイトリストに登録する必要があります。各ホスト名/ FQDNは独自の行にある必要があります-ワイルドカードはなく、名前は正確に一致する必要があります。 KB記事から:
- 「スタート」、「ファイル名を指定して実行」の順にクリックし、「regedit」と入力して、「OK」をクリックします。
- レジストリエディターで、次のレジストリキーを見つけてクリックします。 HKEY_LOCAL_MACHINE \ SYSTEM \ CurrentControlSet \ Control \ Lsa \ MSV1_0
- MSV1_0 を右クリックし、[新規]をポイントして、[複数行文字列値]をクリックします。
- 「 BackConnectionHostNames 」と入力し、Enterキーを押します。
- BackConnectionHostNames を右クリックし、[変更]をクリックします。
- [値のデータ]ボックスに、ローカルコンピューター上にあるサイトのホスト名またはホスト名を入力し、[OK]をクリックします。
- レジストリエディターを終了し、コンピューターを再起動します。
他のヒント
試してみました...
new NetworkCredential( "peter", "password", "boxname" );
あなたも試してみてください...
var credCache = new CredentialCache();
credCache.Add( new Uri ("http://localhost/upload.aspx"),
"Negotiate",
new NetworkCredential("peter", "password", "boxname"));
wc.Credentials = credCache;
また、これによると、IISが正しく構成されていない可能性があります。 「交渉」を交換してみてください。 " Basic"上記で、WebサイトのIIS構成を確認します。考えられる原因も多数ありますこちら。
IEのオプションを試して、サイトをイントラネットゾーンに明示的に追加してください。その後、プログラムを再実行します。また、管理者ログインからプログラムを実行しないでください。これにより、 Internet Explorerの拡張セキュリティ構成がトリガーされる場合があります。
>FirefoxとOperaでサイトにアクセスできるのに、IEやWebClientではできない理由を説明できます。
IISの展開を知らずに、IISで設定されたアップロードの正しい承認ルール(たとえば、コンテンツをアップロードしようとしている適切なディレクトリの適切なallow * ACLなど)があると仮定して、まず明示的に資格情報を設定する代わりに、UseDefaultCredentialsをtrueに設定します。 (設定している資格情報でサーバーにアクセスしていると思うかもしれませんが、そうではありませんか?これが機能する場合は可能です。)
これは非常に一般的なシナリオであるため、ファイルをアップロードしようとしているディレクトリ、つまりそのディレクトリの実際のACLに対するIIS承認規則に焦点を当てます。例えばあなたのサイトはなりすましですか?存在する場合は、そのディレクトリに実際のACLが必要です。そうでない場合は、アカウントアプリプールが実行されているものは何でも