局外登録の実現(BS版の安心登録)、認証コードをサポートしない

7491 ワード

アプリケーションシーンのお客様のニーズは、Webサイト情報管理センターであり、多くのサイトのバックグラウンドのユーザー名とパスワードを保存し、センターユーザーがページブラウズで対応するサイトのバックグラウンドに直接ログインできるようにします.
第1の最も簡単な方法はInteropを呼び出す.SHDocVw.dllはIEを開いて、対応するデータを提出すればいいです.
参照:HttpWebRequestを使用してASPを発行する.NETフォームとセッションとCookieを保持
は、以下のように実装される.
説明:tbUserName={0}&tbPassword={1}&btnLogin={2}は対応するコントロールNameです.
using System;

using System.Collections.Generic;

using System.Web;

using System.Web.UI;

using System.Web.UI.WebControls;

using System.Net;

using System.Text;

using System.IO;

using SHDocVw;





namespace WebApplication2

{

    public partial class Login1 : System.Web.UI.Page

    {

        protected void Page_Load(object sender, EventArgs e)

        {



            CookieContainer cookieContainer = new CookieContainer();



            ///////////////////////////////////////////////////

            // 1.   MyLogin.aspx   ,   GetVeiwState & EventValidation

            ///////////////////////////////////////////////////                

            //             

            string URI = "***";

            HttpWebRequest request = WebRequest.Create(URI) as HttpWebRequest;

            request.Method = "GET";

            request.KeepAlive = false;



            //        

            HttpWebResponse response = request.GetResponse() as HttpWebResponse;

            System.IO.Stream responseStream = response.GetResponseStream();

            System.IO.StreamReader reader = new System.IO.StreamReader(responseStream, Encoding.UTF8);

            string srcString = reader.ReadToEnd();



            //       VeiwState                

            string viewStateFlag = "id=\"__VIEWSTATE\" value=\"";

            int i = srcString.IndexOf(viewStateFlag) + viewStateFlag.Length;

            int j = srcString.IndexOf("\"", i);

            string viewState = srcString.Substring(i, j - i);



            //       EventValidation                

            string eventValidationFlag = "id=\"__EVENTVALIDATION\" value=\"";

            i = srcString.IndexOf(eventValidationFlag) + eventValidationFlag.Length;

            j = srcString.IndexOf("\"", i);

            string eventValidation = srcString.Substring(i, j - i);





            ///////////////////////////////////////////////////

            // 2.        MyLogin.aspx   

            ///////////////////////////////////////////////////

            //        

            string submitButton = "    ";



            //       

            string userName = "***";

            string password = "***";



            //        URL      

            viewState = System.Web.HttpUtility.UrlEncode(viewState);

            eventValidation = System.Web.HttpUtility.UrlEncode(eventValidation);

            submitButton = System.Web.HttpUtility.UrlEncode(submitButton);



            //          。    :user=uesr1&password=123

            string formatString = "tbUserName={0}&tbPassword={1}&btnLogin={2}&__VIEWSTATE={3}&__EVENTVALIDATION={4}";

            string postString = string.Format(formatString, userName, password, submitButton, viewState, eventValidation);

            OpenNewIe(URI, postString);



        }



        public static void OpenNewIe(string url, string postData)

        {

            var ie = new InternetExplorer();

            object vPost, vHeaders, vFlags, vTargetFrame;

            vPost = null;

            vFlags = null;

            vTargetFrame = null;

            vHeaders = "Content-Type: application/x-www-form-urlencoded" + Convert.ToChar(10) + Convert.ToChar(13);

            if (!string.IsNullOrEmpty(postData))

                vPost = ASCIIEncoding.ASCII.GetBytes(postData);

            ie.Visible = true;

            ie.Navigate(url, ref vFlags, ref vTargetFrame, ref vPost, ref vHeaders);



        }



    }

}


第2の方法はmshtmlネーミングスペースを利用してフォーム付与を実現する.
c#制御IEブラウザ参照
具体的には、次のようになります.
 
using System;

using System.Collections.Generic;

using System.Web;

using System.Web.UI;

using System.Web.UI.WebControls;

using System.Diagnostics;

using System.IO;



using SHDocVw;

using System.Text;

using System.Net;

using mshtml;



namespace WebApplication2

{

    public partial class login2 : System.Web.UI.Page

    {

        protected void Page_Load(object sender, EventArgs e)

        {

            string URI = "***";

            var ie = new InternetExplorer();

            object vPost, vHeaders, vFlags, vTargetFrame;

            vPost = null;

            vFlags = null;

            vTargetFrame = null;

            vHeaders = "Content-Type: application/x-www-form-urlencoded" + Convert.ToChar(10) + Convert.ToChar(13);



            ie.Visible = true;

            ie.Navigate(URI, ref vFlags, ref vTargetFrame, ref vPost, ref vHeaders);

            try

            {

                System.Threading.Thread.Sleep(1000);

                HTMLDocument doc = (HTMLDocument)ie.Document;

                HTMLInputElement keyword = (HTMLInputElement)doc.getElementById("tbUserName");

                keyword.value = "***";





                HTMLInputElement keyword1 = (HTMLInputElement)doc.getElementById("tbPassword");

                keyword1.value = "***";



                HTMLInputElement submit = (HTMLInputElement)doc.getElementById("btnLogin");

                submit.click();

            }

            catch (Exception)

            {



                return;

            }

        }

    }

}




3つ目の方法は、下位dllを自分で呼び出してIEを開き、フォームに値を割り当てることです.呼び出されたクラスはI EloginHelperで、
クライアントは次のように実装されます.
 
using System;

using System.Collections.Generic;

using System.Web;

using System.Web.UI;

using System.Web.UI.WebControls;

using IELoginHelper;



namespace WebApplication2

{

    public partial class _Default : System.Web.UI.Page

    {

        protected void Page_Load(object sender, EventArgs e)

        {



           



        }



        protected void Button1_Click(object sender, EventArgs e)

        {

            IEHelper ie = new IEHelper();

            ie.OpenAVisibleBlankDocument();





            object p = null;

          



            string url = @"***";

            bool ret = ie.Navigate(url, ref p, ref p, ref p, ref p);



            ie.SetValueById("txtusername", "***");

            ie.SetValueById("txtpwd", "***");

            ie.ClickButtonByName("***");





           

        }

    }

}




 
1つ目、2つ目はクライアントページJSでエラーが発生した場合、ButtonボタンTypeがSubmitボタンでないなど異常が発生する可能性があります.
添付資料:IELoginHelper.rar
        WebApplication2.rar