0

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;
    }
4

0 に答える 0