2011-11-14 9 views
1

this articleによれば、私はSystem.Windows.Forms.WebBrowserクラスを拡張してカスタムエラー処理を実装しました。主に、それは動作します。WebBrowserコントロールのカスタム401処理の実装

ブラウザに「401 Unauthorized」という応答が表示されると問題が発生します。そのような応答はWebBrowserコントロールに標準のユーザー名/パスワードダイアログを表示させます。ダイアログがキャンセルされるまで、NavigateErrorイベントは発生しません。

私は401応答をキャプチャして自分のカスタム方法で処理するために何ができますか?

NavigateErrorイベントをキャプチャして自分のやり方を処理するなど、できることがあると仮定しましたが、何も見たことがありません。

編集:解決策が見つかりました!
重要な手順は次のとおりです。
WebBrowserコントロールが最初は非セキュアページにナビゲートしなければならない 1(「について:空白の」使用される一般的なURLである)KB 320153
2.ホストを避けるためには、 WebBrowserコントロールの場合、IOleClientSite,IServiceProvider、およびIAuthenticateを実装する必要があります。
は、IAuthenticateの実装でIAuthenticateサービス要求を処理する必要があり、他のすべてのサービス要求はINET_E_DEFAULT_ACTION応答で処理できます。
4. IAuthenticate.Authenticateは、カスタム認証ハンドラです。

答えて

3

implement IAuthenticate and IAuthenticateEx on your webbrowser host。基本的には、サービスがIID_IAuthenticateの場合、IOleClientSiteの実装はIServiceProvider.QueryServiceに応答し、IAuthenticate(Ex)インターフェイス(管理されていないインターフェイス、Marshal.GetComInterfaceForObjectから返されたネイティブインターフェイス)を返す必要があります。認識されないサービス要求の場合、QueryServiceはINET_E_DEFAULT_ACTIONを返す必要があります。

私はWPF WebブラウザがIOleClientSite実装の拡張ポイントを持っているとは思わない。 Winform webbrowserクラスをホストすることができます。このクラスには、IAuthenticate(Ex)実装を提供するオーバーライドされたCreateWebBrowserSiteBase仮想メソッドまたはwrite a webbrowser wrapper from the ground upがあります。

This may not work in a Citrix session

+0

これは、私が探していた情報とほぼ同じです。ありがとう!私は今、最初のものを除いて、すべての認証要求に対してカスタム処理を動作させました。私が行方不明になっていることが分かっていますか? – Task

+0

サーバーからの応答ヘッダーを質問に追加できますか?IEまたはWebブラウザのホストを実行しているときに、フィドラーを使用して応答を収集できます。 –

+2

それを見つけた! IEの既知のバグでは、すべてを説明した記事には小さな参考文献がありました。将来の訪問者にとって重要なステップを強調する質問にいくつかの注釈を追加しました。あなたが知っている、誰かがある時点で私がしなければならない同じ種類のクレイジーなことをしたいと仮定します。 8) – Task

0

私は、認証ヘッダーが失われたり削除されたりせずにサイトをナビゲートできるようになるためには、新しいページごとに次のことを行う必要がありました。このソリューションでは、user:password @ site構文を有効にする必要もありません。

private bool _redirected = false; 
    private const string BaseUrl = @"http://mySite"; 

    private void Navigate() 
    { 
     var helpUrl = BaseUrl; 
     var authHeader = GetAuthHeader(); 

     _docWindow.Browser.Navigate(helpUrl, string.Empty, null, authHeader);   
     _docWindow.Browser.Navigating += Browser_Navigating; 

    } 

    private string GetAuthHeader() 
    { 
     byte[] authData = UnicodeEncoding.UTF8.GetBytes(_userName + ":" + _password); 
     string authHeader = "Authorization: Basic " + Convert.ToBase64String(authData); 
     return authHeader; 
    } 

    void Browser_Navigating(object sender, System.Windows.Navigation.NavigatingCancelEventArgs e) 
    {    
     if (_redirected) 
     { 
      _redirected = false; 
      return; 
     } 
     var newPage = BaseUrl + e.Uri.AbsolutePath; 

     e.Cancel = true; 
     _redirected = true; 
     _docWindow.Browser.Navigate(newPage, string.Empty, null, GetAuthHeader()); 
    } 
関連する問題