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;
}
}
}