[PHP/.NET]如何把PHP站点用户登录会话传递到ASP.NET站点
来源:互联网 发布:coc急速升级数据 编辑:程序博客网 时间:2024/04/29 06:07
如何把PHP站点用户登录会话传递到ASP.NET站点
Version | Date | Creator | Description |
郑昀@掌上灵通 | 草稿 |
目的:
用户从PHP制作的Web站点登录后,有些时候要去浏览另一个由ASP.NET制作的站点,但还要用当前的登录信息。
我们在PHP登录时,把登录信息等存储在了$_SESSION中,由于PHP的Session是自己实现的,所以无法传递给ASP.NET。
那么如何让ASP.NET站点知道用户已经登录了呢,从而把PHP登录会话传递给ASP.NET呢,而且拿到登录的一些参数呢?
当然我们可以直接传递参数,或者把Session存储在数据库中,但是前者不安全,我希望这些事情在后台完成,后者则有点麻烦。
那么有没有什么简单的办法呢?
解决:
基本原理是:
ASP.NET页面在Page_Load方法中, 首先查看请求本站点的Request的Cookies,找到PHPSESSID, 然后我们构造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 { /// /// ValidateLogin 的摘要说明:由于要集成到Php制作的MainSite站点中, /// 首要就是登录统一。 /// 那么我们用这类来保证浏览本站点的用户已经先登录了MainSite站点; /// 我们的基本原理是: /// 首先查看请求本站点的Request的Cookies,找到PHPSESSID,这就是标示当前访问者的SessionID; /// 然后我们构造HttpRequest,以这个PhpSessionID向MainSite站点下的CheckLogin.php请求, /// 看当前这个SessionID所代表的会话是否已经登录; /// 如果登录成功,那么该页面将返回一个字符串:“blablabla”. /// /// /// 作者:郑昀@掌上灵通 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; } } /// /// /// /// 当前Web页面请求的绝对URL /// 要请求的验证页面的相对路径 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; } } } |
Disclaimers:
Programmer’s Blog List: |
本文档仅供参考。本文档所包含的信息代表了在发布之日,zhengyun_ustc对所讨论问题的当前看法,zhengyun_ustc不保证所给信息在发布之日以后的准确性。
用户应清楚本文档的准确性及其使用可能带来的全部风险。可以复制和传播本文档,但须遵守以下条款:
- 复制时不得修改原文,复制内容须包含所有页 ;
- 所有副本均须含有 zhengyun_ustc的版权声明以及所提供的其它声明 ;
- 不得以赢利为目的对本文档进行传播 。
Trackback: http://tb.blog.csdn.net/TrackBack.aspx?PostId=296379
- [PHP/.NET]如何把PHP站点用户登录会话传递到ASP.NET站点
- [PHP/.NET]如何把PHP站点用户登录会话传递到ASP.NET站点
- [PHP/.NET]如何把PHP站点用户登录会话传递到ASP.NET站点
- 多个ASP.NET站点如何通过ASP.NET State服务共享Session会话
- Asp.net推荐站点
- asp.net 资源站点
- asp.net站点导航
- 浅析《ASP.Net Web 站点高级编程》的登录验证!
- 浅析《ASP.Net Web 站点高级编程》的登录验证
- 如何在ASP.NET站点中实现对用户请求的监控
- asp.net中用C#实现站点计数器用户控件
- Asp.net给站点某目录增加Aspnet用户
- asp.net中用C#实现站点计数器用户控件
- ASP.Net中用C#实现站点计数器用户控件
- Asp.net给站点某目录增加Aspnet用户
- asp.net中用C#实现站点计数器用户控件
- asp.net中用C#实现站点计数器用户控件[转]
- ASP.Net中用C#实现站点计数器用户控件
- [人物]USTC十大IT精英
- [收藏]在RUP/XP之前讲的小故事
- [Perl]FTP自动上传文件的脚本以及配置文件
- [收藏]一个广为流传的关于项目管理的通俗讲解
- SQL Server 2005 中的树形数据处理示例-1
- [PHP/.NET]如何把PHP站点用户登录会话传递到ASP.NET站点
- 模仿bloglines的ucfly
- 论坛上一段精彩的“技术受歧视”的对白
- ntext搜索关键字
- 合并有数据的列
- [收藏]在RUP/XP之前讲的小故事
- [收藏]ASP.NET Starter Kit 挖宝记专栏:Portal Starter Kit 可用的宝在那里?
- [C++]打包传输结构体或大内存块的四种办法(完全版)
- Microsoft patterns & practices Enterprise Library下载链接