目的:
用户从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;
}
}
}
新闻热点
疑难解答
图片精选