WebBrowser コントロールを含む WPF ウィンドウがあります。認証が必要なページに移動したいが、ユーザーを自動的にログインさせたい。
byte[] authData = Encoding.UTF8.GetBytes(UserName + ":" + Password);
_header = "Authorization: Basic " + Convert.ToBase64String(authData);
Browser.Navigate(url, string.Empty, null, _header);
問題は、Authorization ヘッダーを提供しているにもかかわらず、WebBrowser がまだユーザー名とパスワードを要求することです。コードのユーザー名とパスワードをプロンプトに入力すると、認証されます (したがって、タイプミスはありません)。
サイトは、基本認証と https を使用して IIS で実行されています。
フィドラーでトラフィックを監視した後、最初に表示されるリクエストには 304 ステータス コードがあり、Authorization ヘッダーが存在します。このリクエストの後に、401 ステータス コードを返す 2 番目のリクエストが続きます。このリクエストには Authorization ヘッダーはありません。
以下のキャッシュヘッダーがどこから来ているか知っている人はいますか? 私はそれらを追加していませんが、それらが問題を引き起こしていると思います。
Fiddler からの最初の要求ヘッダー
If-Modified-Since: Tue, 04 Jun 2013 19:52:22 GMT If-None-Match: "527fa775d61ce1:0" キャッシュ
Client Accept: / Accept-Encoding: gzip, deflate Accept-Language: en-US User-Agent: Mozilla/4.0 (互換性あり; MSIE 7.0; Windows NT 6.1; WOW64; Trident/6.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0; .NET4.0C; .NET4.0E; AskTbORJ/5.15.23.36191; MDDRJS)
Cookie/ログイン認証: 基本 T25saW5lSGVscFVzZXI6SG93Q2FuSUhlbHBZb3Uh
トランスポート接続: Keep-Alive ホスト: docs.new Centurysoftware.com
Fiddler からの 2 番目の要求ヘッダー
クライアント Accept: / Accept-Encoding: gzip, deflate Accept-Language: User-Agent: Mozilla/4.0 (互換性あり; MSIE 7.0; Windows NT 6.1; WOW64; Trident/6.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0; .NET4.0C; .NET4.0E; AskTbORJ/5.15.23.36191; MDDRJS)
その他のリファラー: https://docs.new Centurysoftware.com/
トランスポート接続: Keep-Alive ホスト: docs.new Centurysoftware.com
他に情報が必要な場合はお知らせください。ありがとう。
編集 以下のコメントに記載されているように、リダイレクトのこの動作が予想される場合、おそらくより良い質問は、最初にリダイレクトが発生するのはなぜですか? リダイレクトを防ぐために IIS で変更できる設定はありますか?
最初のリクエストはhttps://docs.new Centurysoftware.com/ へのリクエストです。2 番目のリクエストはhttps://docs.new Centurysoftware.com/welcome.png (デフォルトの iis イメージのみ) へのリクエストです。
注 - IE または Chrome でページを参照すると、リダイレクトが表示されません。
「修正」で編集2
ファイアウォールのリダイレクトのためにリダイレクトが予想され、削除された認証ヘッダーもリダイレクトで予想されるように見えるため、Browser.Navigated イベントをリッスンし、ヘッダー情報を使用してリクエストを再送信することでコードを修正しました。
void BrowserNavigated(object sender, System.Windows.Navigation.NavigationEventArgs e)
{
//Handle the dropped authorization header for the first request (because of firewall redirect)
//and resend the request with the authorization again.
_docWindow.Browser.Navigate(e.Uri, string.Empty, null, _header);
_docWindow.Browser.Navigated -= BrowserNavigated;
}