查看: 9120|回复: 2

如何把PHP站点用户登录会话传递到ASP.NET站点

[复制链接]
发表于 2010-10-28 11:06:08 | 显示全部楼层 |阅读模式
台州网址导航
目的:
用户从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”.
台州维博网络(www.tzweb.com)专门运用PHP+MYSQL/ASP.NET+MSSQL技术开发网站门户平台系统等。
 楼主| 发表于 2010-10-28 11:07:24 | 显示全部楼层
台州网址导航
/// </summary>

    ///

    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();
台州维博网络(www.tzweb.com)专门运用PHP+MYSQL/ASP.NET+MSSQL技术开发网站门户平台系统等。
 楼主| 发表于 2010-10-28 11:07:38 | 显示全部楼层
台州网址导航
// 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;



        }



    }

}
台州维博网络(www.tzweb.com)专门运用PHP+MYSQL/ASP.NET+MSSQL技术开发网站门户平台系统等。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

网站推广
关于我们
  • 台州朗动科技(Tzweb.com)拥有多年开发网站平台系统门户手机客户端等业务的成功经验。主要从事:政企网站,系统平台,微信公众号,各类小程序,手机APP客户端,浙里办微应用,浙政钉微应用、主机域名、虚拟空间、后期维护等服务,满足不同企业公司的需求,是台州地区领先的网络技术服务商!

Hi,扫描关注我

Copyright © 2005-2026 站长论坛 All rights reserved

Powered by 站长论坛 with TZWEB Update Techonolgy Support

快速回复 返回顶部 返回列表