如何把PHP網站使用者登入工作階段傳遞到ASP.NET網站

來源:互聯網
上載者:User
asp.net|網站

目的:
使用者從PHP製作的Web網站登入後,有些時候要去瀏覽另一個由ASP.NET製作的網站,但還要用當前的登入資訊。

我們在PHP登入時,把登入資訊等儲存在了$_SESSION中,由於PHP的Session是自己實現的,所以無法傳遞給ASP.NET。

那麼如何讓ASP.NET網站知道使用者已經登入了呢,從而把PHP登入工作階段傳遞給ASP.NET呢,而且拿到登入的一些參數呢?

當然我們可以直接傳遞參數,或者把Session儲存在資料庫中,但是前者不安全,我希望這些事情在後台完成,後者則有點麻煩。

那麼有沒有什麼簡單的辦法呢?

 

解決:
基本原理是:

    ASP.NET頁面在Page_Load方法中,

    首先查看請求本網站的Request的Cookies,找到PHPSESSID,
        這就是標示當前訪問者的SessionID;

 

    然後我們構造HttpWebRequest,以這個PhpSessionID向PHP網站下的CheckLogin.php頁面請求,


        看當前這個SessionID所代表的會話是否已經登入。

    如果登入成功,那麼該頁面將返回我們規定的一些數值,由ASP.NET鑒別即可。


 

更多詳情:
第一步,得到當前請求的Web頁面的絕對路徑:

String strAbsolutePath;

            strAbsolutePath = Request.Url.AbsoluteUri;

            int nPos = strAbsolutePath.LastIndexOf("/");

            int nRemoveLength = strAbsolutePath.Length - nPos;

            string strUriPath = strAbsolutePath.Remove(nPos, nRemoveLength);

第二步,遍曆Cookie,尋找PHPSessionID:

string strPHPSessionID = "";

            for(int i=0;i < Request.Cookies.Count;i++)

            {

                if("PHPSESSID" == Request.Cookies[i].Name)

                {

                    strPHPSessionID = "PHPSESSID=" + Request.Cookies[i].Value;

                }

            }

第三步,通過ValidateLogin類比HttpWebRequest帶著PhpSessionID請求驗證頁面,看目前使用者是否登入:

ValidateLogin vlLogin = new ValidateLogin(

                    strUriPath,

                    "/../MainSite/CheckLogin.php",

                    strPHPSessionID);

                m_strLoginInfo = vlLogin.LoginInfo.Trim();

我們給System.Web.HttpWebRequest 對象建立一個新的CookieContainer,把PHPSessionID放進去,如下所示:

CookieContainer cookieCon = new CookieContainer();

                hwrRequest.CookieContainer = cookieCon;

                hwrRequest.CookieContainer.SetCookies(new Uri(strValidatePageURL),

                    m_strPHPSessionID);

m_strPHPSessionID是這樣構造的:

PHPSESSID=.....

這樣,ASP.NET發起的請求被主要站台的PHP頁面接收到之後,就會認為是同一個登入工作階段。

ValidateLogin.cs的代碼如附錄所示:
using System;

using System.Web;

using System.IO;

using System.Net;

using System.Text;

namespace Linktone.MySite.Components

{

    /// <summary>

    /// ValidateLogin 的摘要說明:由於要整合到Php製作的MainSite網站中,

    /// 首要就是登入統一。

    /// 那麼我們用這類來保證瀏覽本網站的使用者已經先登入了MainSite網站;

    /// 我們的基本原理是:

    /// 首先查看請求本網站的Request的Cookies,找到PHPSESSID,這就是標示當前訪問者的SessionID;

    /// 然後我們構造HttpRequest,以這個PhpSessionID向MainSite網站下的CheckLogin.php請求,

    /// 看當前這個SessionID所代表的會話是否已經登入;

    /// 如果登入成功,那麼該頁面將返回一個字串:“blablabla”.

    /// </summary>

    ///

    /// 作者:鄭昀@掌上靈通 20050221

    public class ValidateLogin

    {

        /// 要請求的驗證頁面的相對路徑

        private string m_strValidatePageRelateURL;

        /// 從請求端傳遞過來的PHPSessionID

        private string m_strPHPSessionID;

        protected string m_strLastError;

        private WebResponse m_webResponse;

       

        public string ValidatePage

        {

            get { return m_strValidatePageRelateURL; }

            set { m_strValidatePageRelateURL = value; }

        }

        public string LoginOperatorID

        {

            get { return m_strLoginOperatorID; }

            set { m_strLoginOperatorID = value; }

        }

        /// <summary>

        ///

        /// </summary>

        /// <param name="AbsoluteUri">當前Web頁面請求的絕對URL</param>

        /// <param name="ValidatePage">要請求的驗證頁面的相對路徑</param>

        public ValidateLogin(string AbsoluteUri,

                             string ValidatePage,

                             string PHPSessionID)

        {

            m_strValidatePageRelateURL = ValidatePage;

            m_strPHPSessionID = PHPSessionID;

            /// 請求頁面

            RequestGetOperatorID(AbsoluteUri);

        }

        ~ValidateLogin()

        {

            m_webResponse.Close();

        }

        public void RequestGetOperatorID(string strAbsoluteUri)

        {

            try

            {

                String Path;

                Path = strAbsoluteUri;

               

                /// 構建要訪問的絕對路徑

                string strValidatePageURL = Path + m_strValidatePageRelateURL;

                /// 構建請求的HttpWebRequest對象,並設定好Session

                HttpWebRequest hwrRequest = (HttpWebRequest)WebRequest.Create(

                    strValidatePageURL);

                hwrRequest.Method = "GET";

                hwrRequest.Proxy = System.Net.WebProxy.GetDefaultProxy();

                // allow auto redirects from redirect headers

                hwrRequest.AllowAutoRedirect=true;

                // 30 second timeout for request

                hwrRequest.Timeout=(int) new TimeSpan(0,0,60).TotalMilliseconds;

                // give the crawler a name.

                hwrRequest.UserAgent = "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1)";

       

                hwrRequest.ContentType = "application/x-www-form-urlencoded";

                CookieContainer cookieCon = new CookieContainer();

                hwrRequest.CookieContainer = cookieCon;

                hwrRequest.CookieContainer.SetCookies(new Uri(strValidatePageURL),

                    m_strPHPSessionID);

   

                hwrRequest.KeepAlive = false;

                hwrRequest.ProtocolVersion = HttpVersion.Version10;

               

                /// WebRequest 執行個體上的 GetResponse 方法

                /// 將來自用戶端應用程式的請求發送到在 URI 中標識的伺服器。

                m_webResponse = hwrRequest.GetResponse();

                /// GetResponse 和 EndGetResponse 方法返回一個 WebResponse 執行個體,

                /// 該執行個體提供對伺服器返回的資料的訪問。

                /// 因為此資料由 GetResponseStream 方法作為流提供給發出請求的應用程式,

                /// 所以它可以在應用程式中的使用資料流的任何地方使用。

                StreamReader sr = new StreamReader(

                    m_webResponse.GetResponseStream(),

                    Encoding.GetEncoding("GB2312"));

                string sValidate = sr.ReadToEnd();

                sr.Close();

                /// 檢驗驗證登陸的頁面是否確認登陸了,否則直接引導到login.php頁面

                /// 調用者負責重新導向

                /// m_strLoginOperatorID = blabla;

               

            }

            catch (Exception eExcep)

            {

                m_strLastError = eExcep.Message;

            }

            return;

        }

    }

}
 



相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.