首页 > 编程 > .NET > 正文

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

2024-07-10 13:06:11
字体:
来源:转载
供稿:网友

目的:
用户从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;

 

        }

 

    }

}
 

中国最大的web开发资源网站及技术社区,
发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表