`
piperzero
  • 浏览: 3490618 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
文章分类
社区版块
存档分类
最新评论

[PHP/.NET]如何把PHP站点用户登录会话传递到ASP.NET站点

阅读更多
<iframe align="top" marginwidth="0" marginheight="0" src="http://www.zealware.com/csdnblog01.html" frameborder="0" width="728" scrolling="no" height="90"></iframe>

如何把PHP站点用户登录会话传递到ASP.NET站点

<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />

Version

Date

Creator

Description

<?xml:namespace prefix = st1 ns = "urn:schemas-microsoft-com:office:smarttags" /><chsdate w:st="on" isrocdate="False" islunardate="False" day="30" month="12" year="1899"><span lang="EN-US" style="FONT-FAMILY: Arial">1.0.0</span></chsdate>.1

<chsdate w:st="on" isrocdate="False" islunardate="False" day="21" month="2" year="2005"><span lang="EN-US" style="FONT-FAMILY: Arial">2005-2-21</span></chsdate>

郑昀@掌上灵通

草稿

目的:

用户从PHP制作的Web站点登录后,有些时候要去浏览另一个由ASP.NET制作的站点,但还要用当前的登录信息。

我们在PHP登录时,把登录信息等存储在了$_SESSION中,由于PHPSession是自己实现的,所以无法传递给ASP.NET

那么如何让ASP.NET站点知道用户已经登录了呢,从而把PHP登录会话传递给ASP.NET呢,而且拿到登录的一些参数呢?

当然我们可以直接传递参数,或者把Session存储在数据库中,但是前者不安全,我希望这些事情在后台完成,后者则有点麻烦。

那么有没有什么简单的办法呢?

解决:

基本原理是:

ASP.NET页面在Page_Load方法中,

首先查看请求本站点的RequestCookies,找到PHPSESSID
这就是标示当前访问者的SessionID

然后我们构造HttpWebRequest,以这个PhpSessionIDPHP站点下的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

{

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><p></p></summary>

/// ValidateLogin 的摘要说明:由于要集成到Php制作的MainSite站点中,

/// 首要就是登录统一。

/// 那么我们用这类来保证浏览本站点的用户已经先登录了MainSite站点;

/// 我们的基本原理是:

/// 首先查看请求本站点的RequestCookies,找到PHPSESSID,这就是标示当前访问者的SessionID

/// 然后我们构造HttpRequest,以这个PhpSessionIDMainSite站点下的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; }

}

/// <summary><p></p></summary>

///

///

/// 当前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;

}

}

}

编写者:郑昀@linktone

Disclaimers

Programmer’s Blog List

<?xml:namespace prefix = v ns = "urn:schemas-microsoft-com:vml" /><shapetype id="_x0000_t75" stroked="f" filled="f" path="m@4@5l@4@11@9@11@9@5xe" o:preferrelative="t" o:spt="75" coordsize="21600,21600"><stroke joinstyle="miter"></stroke><formulas><f eqn="if lineDrawn pixelLineWidth 0"></f><f eqn="sum @0 1 0"></f><f eqn="sum 0 0 @1"></f><f eqn="prod @2 1 2"></f><f eqn="prod @3 21600 pixelWidth"></f><f eqn="prod @3 21600 pixelHeight"></f><f eqn="sum @0 0 1"></f><f eqn="prod @6 1 2"></f><f eqn="prod @7 21600 pixelWidth"></f><f eqn="sum @8 21600 0"></f><f eqn="prod @7 21600 pixelHeight"></f><f eqn="sum @10 21600 0"></f></formulas><path o:connecttype="rect" gradientshapeok="t" o:extrusionok="f"></path><lock aspectratio="t" v:ext="edit"></lock></shapetype><shape id="_x0000_i1025" style="WIDTH: 0.75pt; HEIGHT: 0.75pt" type="#_x0000_t75" alt=""></shape>

博客堂

博客园

Don Box's Blog

Eric.Weblog()

Blogs@asp.net

本文档仅供参考。本文档所包含的信息代表了在发布之日,zhengyun_ustc对所讨论问题的当前看法,zhengyun_ustc不保证所给信息在发布之日以后的准确性。

用户应清楚本文档的准确性及其使用可能带来的全部风险。可以复制和传播本文档,但须遵守以下条款:

  1. 复制时不得修改原文,复制内容须包含所有页

  2. 所有副本均须含有 zhengyun_ustc的版权声明以及所提供的其它声明

  3. 不得以赢利为目的对本文档进行传播



Trackback: http://tb.blog.csdn.net/TrackBack.aspx?PostId=296379


分享到:
评论

相关推荐

    asp.net 会话状态

    讲述asp.net生命周期中回话状态的作用,意义,以及编程方法。

    如何使用 ASP.NET 实用工具加密凭据和会话状态连接字符串

    如何使用 ASP.NET 实用工具加密凭据和会话状态连接字符串

    从ASP到ASP.NET的会话状态管理

    介绍了ASP度ASP.NET中会话状态管理方式,给出了ASP应用程序迁移到ASP.NET时共事会话状态的一种解决方案

    Asp.net中防止用户多次登录的方法

    常见的处理方法是,在用户登录时,判断此用户是否已经在 Application 中存在,如果存在就报错,不存在的话就加到 Application 中。Application 是所有 session 共有的,整个 web 应用程序唯一的一个对象。以下是引用...

    如何在ASP和ASP.NET中共享会话状态

    如何在ASP和ASP.NET中共享会话状态,马文婕,李娜,ASP.NET的出现大大提高了编写的站点的性能,但传统的ASP技术也需要同时应用,两种技术间会话状态的共享是必须解决的问题。文章即对�

    Asp.net系统限制非法用户登录次数

    用户非法登录次数超过指定次数后锁定该用户,需在指定时间后才能再次登录

    asp.net简单会话(session)应用

    asp.net简单会话(session)应用,可以对会话机制有个大概的了解

    ASP.NET常见问题集锦.zip

    ASP.NET实现用户在线检测的类源码.txt ASP.NET常见问题集锦.zip ASP.NET弹出式日历选择控件的实现.doc ASP.NET程序中常用的三十三种代码.txt ASP.NET页面间数据传递小结.doc ASPNETXML深入编程.pdf C Primer ...

    企业微信开发.net版[盛派微信SDK]

    微信公众平台SDK Senparc.Weixin for C#,...已经支持用户会话上下文(解决服务器无法使用Session处理用户信息的问题)。 已经全面支持微信公众号、企业号、开放平台的最新API。 已经支持分布式缓存及缓存策略扩展。

    ASP.NET测试题.docx

    ASP.NET 相关知识点总结 本文总结了 ASP.NET 相关的知识点,涵盖了 ASP.NET 的基本概念、语言特性、Web 控件、Session 和 Application 对象、ADO.NET 等方面。 一、ASP.NET 基本概念 * ASP.NET 程序设计有两种...

    ASP.net技术内幕

    内容包括:ASP.NET Web表单的使用,高级ASP.NET页面的开发,ADO.NET的使用,ASP.NET应用程序的使用, ASP.NET应用程序的保护,ASP.NET Web服务的建立,.NET框架的利用,自定义的ASP.NET控件的建立,ASP.NET的应用...

    【ASP.NET编程知识】ASP.NET配置文件Web.config用法详解.docx

    ASP.NET 配置文件 Web.config 用法详解 本文对 ASP.NET 配置文件 Web.config 的用法进行了详细的解释。Web.config 文件是一个 XML 文本文件,用于存储 ASP.NET Web 应用程序的配置信息。它可以出现在应用程序的每一...

    ASP.NET教学讲义,完整章节

    5.8 Session—管理用户会话状态 93 5.9 计数器示例 96 5.10 Global.asax 98 5.11 使用Viewstate保持窗体状态 99 5.12 把视图状态用作数据存储 100 5.13 利用查询字符串传递数据 101 5.14 利用隐藏的窗体字段传递数据...

    在asp.net中实现会话状态基础

    在asp.net中实现会话状态基础

    无法向会话状态服务器发出会话状态请求。请确保已启动 ASP.NET State service,并且客户端和服务器端口保持相同。

    无法向会话状态服务器发出会话状态请求。请确保已启动 ASP.NET State service,并且客户端和服务器端口保持相同。 终极解决!1

    asp.net教学讲义

    5.8 Session—管理用户会话状态 84 5.8.1 Session的属性和方法 84 5.8.2 Session配置 85 5.8.3 session示例 85 5.9 计数器示例 87 5.10 Global.asax 89 5.11 使用Viewstate保持窗体状态 90 5.12 把视图状态用作数据...

    ASP.NET4高级程序设计第4版 带目录PDF 分卷压缩包 part1

    ASP.NET 4高级程序设计(第4版)》【原版书为:Pro ASP.NET 4 in C# 2010】是ASP.NET领域的鸿篇巨制,全面讲解了ASP.NET4的各种特性及其背后的工作原理,并给出了许多针对如何构建复杂、可扩展的网站从实践中得出的...

    ASP.NET会话管理

    Asp.Net的强大功能之一就是能自动保持服务器控件的状态(包括其控件和Html)而无需用户编写任何代码

    构建高性能可扩展ASP.NET网站 (中文版) part2

    《构建高性能可扩展ASP.NET网站》针对ASP.NET网站开发中可能遇到的问题,给出了经过实践检验的具体解决方法。涉及的内容包括:加快显示HTML的方法、缓存的最佳方式、如何使用IIS、如何处理会话状态、如何配置SQL ...

    asp.net4 in C#2010

    该书提供了详尽的ASP.NET的覆盖面,引导你从你的第一个步骤,一直到最先进的技术,如查询从一个网页数据库和优化您的网站以获得最佳性能。在这些网页,你会发现“最佳做法”和密钥数据库和XML的原则,全面的讨论让你...

Global site tag (gtag.js) - Google Analytics