日期: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