Winforms,CefSharp:不显示基本身份验证的身份验证弹出窗口 [英] Winforms,CefSharp : Authentication popup for basic authentication not show

查看:98
本文介绍了Winforms,CefSharp:不显示基本身份验证的身份验证弹出窗口的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在努力在WinForms应用程序中添加cefsharp.我们的网站使用基本身份验证进行访问,但是CefSharp不会显示该弹出窗口.我发现了

解决方案

对我有用的解决方案:

 公共类MyRequestHandler:IRequestHandler{私有字符串userName;私人字符串密码;公共MyRequestHandler(字符串userName,字符串密码){this.userName =用户名;this.password =密码;}//公共静态只读字符串VersionNumberString = String.Format(铬:{0},CEF:{1},CefSharp:{2}",//Cef.ChromiumVersion,Cef.CefVersion,Cef.CefSharpVersion);bool IRequestHandler.OnBeforeBrowse(IWebBrowser browserControl,IBrowser浏览器,IFrame框架,IRequest请求,bool isRedirect){返回false;}bool IRequestHandler.OnOpenUrlFromTab(IWebBrowser browserControl,IBrowser浏览器,IFrame框架,字符串targetUrl,WindowOpenDisposition targetDisposition,bool userGesture){返回OnOpenUrlFromTab(browserControl,浏览器,框架,targetUrl,targetDisposition,userGesture);}受保护的虚拟布尔值OnOpenUrlFromTab(IWebBrowser browserControl,IBrowser浏览器,IFrame框架,字符串targetUrl,WindowOpenDisposition targetDisposition,bool userGesture){返回false;}bool IRequestHandler.OnCertificateError(IWebBrowser browserControl,IBrowser浏览器,CefErrorCode errorCode,字符串requestUrl,ISslInfo sslInfo,IRequestCallback回调){//注意:如果您不希望实现此方法,则返回false是默认行为//我们还建议您显式处理回调,因为它包装了非托管资源.//callback.Dispose();//返回false;//注意:以异步方式执行回调时,需要检查其是否已被释放//如果(!callback.IsDisposed)//{//使用(回调)//{////允许证书////callback.Continue(true);////返回true;//}//}返回false;}IRequestHandler.OnPluginCrashed(IWebBrowser browserControl,IBrowser浏览器,字符串pluginPath){//TODO:在此处添加您自己的代码,以处理由于某种原因而导致插件崩溃的情况.}CefReturnValue IRequestHandler.OnBeforeResourceLoad(IWebBrowser browserControl,IBrowser浏览器,IFrame框架,IRequest请求,IRequestCallback回调){//如何设置Referer//设置任何标题时都应该起作用//对于此示例,仅在使用我们的自定义方案时设置Referer//var url = new Uri(request.Url);//如果(url.Scheme == CefSharpSchemeHandlerFactory.SchemeName)//{////Referrer现在使用其自己的方法设置(之前已在标头中设置)//request.SetReferrer("http://google.com",ReferrerPolicy.Default);//}//在每个请求中设置User-Agent的示例.//var headers = request.Headers;//var userAgent = headers ["User-Agent"];//headers ["User-Agent"] = userAgent +"CefSharp";//request.Headers =标头;//注意:如果您不希望实现此方法,则返回false是默认行为//我们还建议您显式处理回调,因为它包装了非托管资源.//callback.Dispose();//返回false;///注意:以异步方式执行回调时,需要检查是否已处置//如果(!callback.IsDisposed)//{//使用(回调)//{//如果(request.Method =="POST")//{//使用(var postData = request.PostData)//{//如果(postData!= null)//{//var elements = postData.Elements;//var charSet = request.GetCharSet();//foreach(元素中的var元素)//{//如果(element.Type == PostDataElementType.Bytes)//{//var body = element.GetBody(charSet);//}//}//}//}//}////要重定向的注意事项,只需设置请求网址////如果(request.Url.StartsWith("https://www.google.com",StringComparison.OrdinalIgnoreCase))////{////request.Url ="https://github.com/";////}////以异步方式进行回调////callback.Continue(true);////返回CefReturnValue.ContinueAsync;//}//}返回CefReturnValue.Continue;}bool IRequestHandler.GetAuthCredentials(IWebBrowser browserControl,IBrowser浏览器,IFrame框架,bool isProxy,字符串主机,int端口,字符串领域,字符串方案,IAuthCallback回调){//注意:如果您不希望实现此方法,则返回false是默认行为//我们还建议您显式处理回调,因为它包装了非托管资源.callback.Continue(用户名,密码);返回true;}IRequestHandler.OnRenderProcessTerminated(IWebBrowser browserControl,IBrowser浏览器,CefTerminationStatus状态){//TODO:在此处添加您自己的代码,以处理渲染流程由于某种原因终止的情况.//browserControl.Load(CefExample.RenderProcessCrashedUrl);}bool IRequestHandler.OnQuotaRequest(IWebBrowser browserControl,IBrowser浏览器,字符串originUrl,long newSize,IRequestCallback回调){//注意:如果您不希望实现此方法,则返回false是默认行为//我们还建议您显式处理回调,因为它包装了非托管资源.//callback.Dispose();//返回false;//注意:以异步方式执行回调时,需要检查其是否已被释放//如果(!callback.IsDisposed)//{//使用(回调)//{////接受提高配额的请求////callback.Continue(true);////返回true;//}//}返回false;}bool IRequestHandler.OnProtocolExecution(IWebBrowser browserControl,IBrowser浏览器,字符串url){返回url.StartsWith("mailto");}IRequestHandler.OnRenderViewReady(IWebBrowser browserControl,IBrowser浏览器){}bool IRequestHandler.OnResourceResponse(IWebBrowser browserControl,IBrowser浏览器,IFrame框架,IRequest请求,IResponse响应){//注意:您不能修改响应,只能修改请求//您现在可以访问标题//var headers = response.ResponseHeaders;返回false;}IResponseFilter IRequestHandler.GetResourceResponseFilter(IWebBrowser browserControl,IBrowser浏览器,IFrame框架,IRequest请求,IResponse响应){//var url = new Uri(request.Url);//如果(url.Scheme == CefSharpSchemeHandlerFactory.SchemeName)//{//如果(request.Url.Equals(CefExample.ResponseFilterTestUrl,StringComparison.OrdinalIgnoreCase))//{//返回新的FindReplaceResponseFilter("REPLACE_THIS_STRING",这是替换的字符串!");//}//如果(request.Url.Equals("custom://cefsharp/assets/js/jquery.js",StringComparison.OrdinalIgnoreCase))//{//返回新的AppendResponseFilter(System.Environment.NewLine +"//CefSharp附加此注释.");//}//返回新的PassThruResponseFilter();//}返回null;}IRequestHandler.OnResourceLoadComplete(IWebBrowser browserControl,IBrowser浏览器,IFrame框架,IRequest请求,IResponse响应,UrlRequestStatus状态,长时间接收到ContentLength){}公共布尔OnSelectClientCertificate(IWebBrowser browserControl,IBrowser浏览器,bool isProxy,字符串主机,int端口,X509Certificate2Collection证书,ISelectClientCertificateCallback回调){返回false;}公共无效OnResourceRedirect(IWebBrowser browserControl,IBrowser浏览器,IFrame框架,IRequest请求,IResponse响应,引用字符串newUrl){}} 

并在Chrome浏览器中调用它,就像这样:

  private void InitializeChromium(){chromeBrowser =新的ChromiumWebBrowser("https://www.google.com"){Dock = DockStyle.Fill,};chromeBrowser.RequestHandler = new MyRequestHandler("actual_username","actual_password");this.Controls.Add(chromiumBrowser);} 

I am working on adding cefsharp in a WinForms application. Our website uses basic authentication for access, but CefSharp wont show that popup. I found out this and this, but Visual studio doesn't implement the interface and complains about AuthDialog being an unknown class. I come from Java side, not much idea about classes in Winforms, but I cant find AuthDialog. What am I doing wrong?

Code :

 bool IRequestHandler.GetAuthCredentials(IWebBrowser browser, bool isProxy, string host, int port,
            string realm, string scheme, ref string username, ref string password)
        {
            //NOTE: If you do not wish to implement this method returning false is the default behaviour
            // We also suggest you explicitly Dispose of the callback as it wraps an unmanaged resource.

            // shyam - original implemenation.
            //callback.Dispose();
            //return false;

            bool handled = false;

            // Instantiate the dialog box

            AuthDialog dlg = new AuthDialog(host); // create new dialog with username and password field.

            // Open the dialog box modally 
            dlg.ShowDialog();

            if (dlg.DialogResult == System.Windows.Forms.DialogResult.OK)
            {
                // The user did not cancel out of the dialog. Retrieve the username and password.
                callback.Continue(dlg.UserName, dlg.Password);
                handled = true;
            }

            return handled;
        }

Screenshots :

解决方案

The solution which worked for me :

public class MyRequestHandler : IRequestHandler
    {
        private string userName;
        private string password;

        public MyRequestHandler(string userName, string password)
        {
            this.userName = userName;
            this.password = password;
        }


        //public static readonly string VersionNumberString = String.Format("Chromium: {0}, CEF: {1}, CefSharp: {2}",
        //   Cef.ChromiumVersion, Cef.CefVersion, Cef.CefSharpVersion);

        bool IRequestHandler.OnBeforeBrowse(IWebBrowser browserControl, IBrowser browser, IFrame frame, IRequest request, bool isRedirect)
        {
            return false;
        }

        bool IRequestHandler.OnOpenUrlFromTab(IWebBrowser browserControl, IBrowser browser, IFrame frame, string targetUrl, WindowOpenDisposition targetDisposition, bool userGesture)
        {
            return OnOpenUrlFromTab(browserControl, browser, frame, targetUrl, targetDisposition, userGesture);
        }

        protected virtual bool OnOpenUrlFromTab(IWebBrowser browserControl, IBrowser browser, IFrame frame, string targetUrl, WindowOpenDisposition targetDisposition, bool userGesture)
        {
            return false;
        }

        bool IRequestHandler.OnCertificateError(IWebBrowser browserControl, IBrowser browser, CefErrorCode errorCode, string requestUrl, ISslInfo sslInfo, IRequestCallback callback)
        {
            //NOTE: If you do not wish to implement this method returning false is the default behaviour
            // We also suggest you explicitly Dispose of the callback as it wraps an unmanaged resource.
            //callback.Dispose();
            //return false;

            //NOTE: When executing the callback in an async fashion need to check to see if it's disposed
            //if (!callback.IsDisposed)
            //{
            //    using (callback)
            //    {
            //        //To allow certificate
            //        //callback.Continue(true);
            //        //return true;
            //    }
            //}

            return false;
        }

        void IRequestHandler.OnPluginCrashed(IWebBrowser browserControl, IBrowser browser, string pluginPath)
        {
            // TODO: Add your own code here for handling scenarios where a plugin crashed, for one reason or another.
        }

        CefReturnValue IRequestHandler.OnBeforeResourceLoad(IWebBrowser browserControl, IBrowser browser, IFrame frame, IRequest request, IRequestCallback callback)
        {
            //Example of how to set Referer
            // Same should work when setting any header

            // For this example only set Referer when using our custom scheme
            //var url = new Uri(request.Url);
            //if (url.Scheme == CefSharpSchemeHandlerFactory.SchemeName)
            //{
            //    //Referrer is now set using it's own method (was previously set in headers before)
            //    request.SetReferrer("http://google.com", ReferrerPolicy.Default);
            //}

            //Example of setting User-Agent in every request.
            //var headers = request.Headers;

            //var userAgent = headers["User-Agent"];
            //headers["User-Agent"] = userAgent + " CefSharp";

            //request.Headers = headers;

            //NOTE: If you do not wish to implement this method returning false is the default behaviour
            // We also suggest you explicitly Dispose of the callback as it wraps an unmanaged resource.
            //callback.Dispose();
            //return false;

            //NOTE: When executing the callback in an async fashion need to check to see if it's disposed
            //if (!callback.IsDisposed)
            //{
            //    using (callback)
            //    {
            //        if (request.Method == "POST")
            //        {
            //            using (var postData = request.PostData)
            //            {
            //                if (postData != null)
            //                {
            //                    var elements = postData.Elements;

            //                    var charSet = request.GetCharSet();

            //                    foreach (var element in elements)
            //                    {
            //                        if (element.Type == PostDataElementType.Bytes)
            //                        {
            //                            var body = element.GetBody(charSet);
            //                        }
            //                    }
            //                }
            //            }
            //        }

            //        //Note to Redirect simply set the request Url
            //        //if (request.Url.StartsWith("https://www.google.com", StringComparison.OrdinalIgnoreCase))
            //        //{
            //        //    request.Url = "https://github.com/";
            //        //}

            //        //Callback in async fashion
            //        //callback.Continue(true);
            //        //return CefReturnValue.ContinueAsync;
            //    }
            //}

            return CefReturnValue.Continue;
        }

        bool IRequestHandler.GetAuthCredentials(IWebBrowser browserControl, IBrowser browser, IFrame frame, bool isProxy, string host, int port, string realm, string scheme, IAuthCallback callback)
        {
            //NOTE: If you do not wish to implement this method returning false is the default behaviour
            // We also suggest you explicitly Dispose of the callback as it wraps an unmanaged resource.

            callback.Continue(userName, password);           

            return true;
        }

        void IRequestHandler.OnRenderProcessTerminated(IWebBrowser browserControl, IBrowser browser, CefTerminationStatus status)
        {
            // TODO: Add your own code here for handling scenarios where the Render Process terminated for one reason or another.
            //  browserControl.Load(CefExample.RenderProcessCrashedUrl);
        }

        bool IRequestHandler.OnQuotaRequest(IWebBrowser browserControl, IBrowser browser, string originUrl, long newSize, IRequestCallback callback)
        {
            //NOTE: If you do not wish to implement this method returning false is the default behaviour
            // We also suggest you explicitly Dispose of the callback as it wraps an unmanaged resource.
            //callback.Dispose();
            //return false;

            //NOTE: When executing the callback in an async fashion need to check to see if it's disposed
            //if (!callback.IsDisposed)
            //{
            //    using (callback)
            //    {
            //        //Accept Request to raise Quota
            //        //callback.Continue(true);
            //        //return true;
            //    }
            //}

            return false;
        }


        bool IRequestHandler.OnProtocolExecution(IWebBrowser browserControl, IBrowser browser, string url)
        {
            return url.StartsWith("mailto");
        }

        void IRequestHandler.OnRenderViewReady(IWebBrowser browserControl, IBrowser browser)
        {

        }

        bool IRequestHandler.OnResourceResponse(IWebBrowser browserControl, IBrowser browser, IFrame frame, IRequest request, IResponse response)
        {
            //NOTE: You cannot modify the response, only the request
            // You can now access the headers
            //var headers = response.ResponseHeaders;

            return false;
        }

        IResponseFilter IRequestHandler.GetResourceResponseFilter(IWebBrowser browserControl, IBrowser browser, IFrame frame, IRequest request, IResponse response)
        {
            //var url = new Uri(request.Url);
            //if (url.Scheme == CefSharpSchemeHandlerFactory.SchemeName)
            //{
            //    if (request.Url.Equals(CefExample.ResponseFilterTestUrl, StringComparison.OrdinalIgnoreCase))
            //    {
            //        return new FindReplaceResponseFilter("REPLACE_THIS_STRING", "This is the replaced string!");
            //    }

            //    if (request.Url.Equals("custom://cefsharp/assets/js/jquery.js", StringComparison.OrdinalIgnoreCase))
            //    {
            //        return new AppendResponseFilter(System.Environment.NewLine + "//CefSharp Appended this comment.");
            //    }

            //    return new PassThruResponseFilter();
            //}

            return null;
        }

        void IRequestHandler.OnResourceLoadComplete(IWebBrowser browserControl, IBrowser browser, IFrame frame, IRequest request, IResponse response, UrlRequestStatus status, long receivedContentLength)
        {

        }

        public bool OnSelectClientCertificate(IWebBrowser browserControl, IBrowser browser, bool isProxy, string host, int port, X509Certificate2Collection certificates, ISelectClientCertificateCallback callback)
        {
            return false;
        }

        public void OnResourceRedirect(IWebBrowser browserControl, IBrowser browser, IFrame frame, IRequest request, IResponse response, ref string newUrl)
        {

        }
    }

and call it in chromium browser call it like this :

 private void InitializeChromium()
        {
            chromiumBrowser = new ChromiumWebBrowser("https://www.google.com")
            {
                Dock = DockStyle.Fill,
            };
            chromiumBrowser.RequestHandler = new MyRequestHandler("actual_username","actual_password");

            this.Controls.Add(chromiumBrowser);
        }

这篇关于Winforms,CefSharp:不显示基本身份验证的身份验证弹出窗口的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆