2008-10-07 9 views
8

Używam kontrolki Webbrowser do logowania się do witryny HTTPS z "niezaufanym certyfikatem". ale dostaję okienko okno taki standart "Alert zabezpieczeń" o niezaufanych certyfikatu:Jak wyłączyć okno "Alert bezpieczeństwa" w kontrolce Webbrowser

Security Alert window

Muszę znaleźć tego okna tytule i wysłać go Alt + Y nacisnąć Tak:

int iHandle = NativeWin32.FindWindow(null, "Security Alert"); 
NativeWin32.SetForegroundWindow(iHandle); 
System.Windows.Forms.SendKeys.Send("Y%"); 

, ale użytkownik może zobaczyć migotanie tego okna.

Jak mogę zignorować ten alert?
Czy wyłączyć kontrolę "niezaufanego certyfikatu" w kontrolce przeglądarki internetowej?

+0

możliwe duplikat kontrolować [WebBrowser - zignorować błąd SSL] (http://stackoverflow.com/questions/6933254/webbrowser-control-ignore-ssl-errors) –

+0

Zobacz też: Błędy SSL w kontrolkach WebBrowser dla aplikacji konsolowych http://stackoverflow.com/questions/17698002/ignoring-web-browser-ssl-security-alerts-in-console-application/21008529 –

Odpowiedz

4

ten powinien zrobić:

public static bool ValidateServerCertificate(object sender, X509Certificate certificate, X509Chain chain, SslPolicyErrors sslPolicyErrors) 
{ 
    return true; 
} 

ServicePointManager.ServerCertificateValidationCallback = new RemoteCertificateValidationCallback(ValidateServerCertificate); 

Oczywiście, oślepiająco pozwalając certyfikaty to zagrożenie bezpieczeństwa. Bądź ostrożny.

+3

Nie mogłem tego zrobić pracować z formantem WebBrowser. To może być tylko ja, ale podejrzewam, że to rozwiązanie nie ma zastosowania, ponieważ kontrola System.Windows.Forms.WebBrowser nie wysyła żądań przez .NET. –

+1

@ Danielballinger To nie tylko ty. Mam ten sam problem (http://stackoverflow.com/q/12999735/1357272). – ih8ie8

+0

Jest to TYLKO dla obiektów zarządzanych. Kontrola przeglądarki to opakowana kontrola niezarządzana. Właśnie dlatego to nie działa. – Odys

6

OK, artykuł kończy się na projekcie kodu - patrz http://www.codeproject.com/KB/shell/WebBrowserControlDialogs.aspx Mam nadzieję, że to pomoże.

+0

HI @BimJearn, świetna robota. Jest to bardzo interesujący sposób przechwytywania wszystkich wiadomości wyskakujących.Należy jednak zachować ostrożność: ponieważ powinieneś polegać na zawartości tekstu wiadomości, aby określić rodzaj wyskakującego okienka, nie będzie to działać, jeśli język systemu operacyjnego Windows jest inny niż angielski. –

+0

Jest to jedyna rzecz, która mi się przydała. Jak już wspomniano, jest to specyficzne dla języka, ale wydaje się, że klasa StringConstants może być edytowana dość łatwo, aby mogła pomieścić inne języki. +1 – smitty1

1

Jeśli certyfikat nie pochodzi od zaufanej instytucji certyfikującej (pierwszy punkt w monicie), można zainstalować certyfikat na zaufanym głównym urzędzie certyfikacji na danym komputerze.

Możesz to zrobić w polu Wyświetl certyfikat.

Pod pewnymi względami może to być prostsze rozwiązanie, ponieważ nie wymaga żadnych zmian kodu, które akceptują wszystkie certyfikaty. Wymaga to jednak zainstalowania certyfikatu wszędzie tam, gdzie używana jest aplikacja.

+0

Wygląda na świetny pomysł, ale po prostu próbowałem go i [to nie działało dla mnie] (http://stackoverflow.com/q/12999735/1357272) z jakiegoś powodu. Jakieś pomysły, dlaczego? – ih8ie8

0

Kiedy ustawić właściwość WebBrowser.ScriptErrorsSuppressed false, nie dostanę te wyskakujące okienka już

+0

To to ukryje. Nie klikniesz TAK – Odys

+0

jesteś tego pewien? mój kod działa już od kilku miesięcy bez problemów – Adil

+0

Tak, tylko go ukryje, więc strona nie załaduje się w przypadku OP –

1

Tutaj idziemy z rozwiązaniem: uruchomić go na razie Browser_Navigated jako podstawową Składnik activeX ma wartość zerową do tego czasu.

Refhttps://social.msdn.microsoft.com/Forums/vstudio/en-US/4f686de1-8884-4a8d-8ec5-ae4eff8ce6db/new-wpf-webbrowser-how-do-i-suppress-script-errors?forum=wpf

  private void Browser_Navigating_1(object sender, NavigatingCancelEventArgs e) 
     { 
     HideScriptErrors(Browser,true); 

     } 

    public void HideScriptErrors(WebBrowser wb, bool Hide) 
    { 

     FieldInfo fiComWebBrowser = typeof(WebBrowser).GetField("_axIWebBrowser2", BindingFlags.Instance | BindingFlags.NonPublic); 
     if (fiComWebBrowser == null) return; 
     object objComWebBrowser = fiComWebBrowser.GetValue(wb); 

     if (objComWebBrowser == null) return; 

     objComWebBrowser.GetType().InvokeMember(
     "Silent", BindingFlags.SetProperty, null, objComWebBrowser, new object[] { Hide }); 

    } 
Powiązane problemy