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