日期:2011-09-16  浏览次数:20501 次

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