`
piperzero
  • 浏览: 3555248 次
  • 性别: 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 会话状态是Web开发中用于保持用户在浏览多页应用时的状态信息的关键机制。由于HTTP协议的无状态特性,服务器无法自动记住不同请求之间的用户信息。为了解决这个问题,ASP.NET提供了会话状态功能,使得开发者...

    c#/.net 微信app支付服务器端demo

    2. **客户端获取预支付交易会话标识**:商户服务器将prepay_id通过自定义方式传递给客户端(App)。 3. **客户端发起支付请求**:客户端利用prepay_id,通过微信支付SDK发起支付请求。 4. **微信支付处理请求并返回...

    ASP.NET登陆程序

    这个程序的核心功能包括用户注册和登录,涉及到的关键技术主要包括ASP.NET Web Forms、页面生命周期管理、视图状态、服务器控件、数据验证、以及用户会话管理。 首先,ASP.NET Web Forms是ASP.NET框架的一部分,它...

    Asp.Net MVC记住用户登录信息 下次登录无需输入密码

    总之,Asp.Net MVC的"记住我"功能通过Cookie实现了用户登录状态的持久化,为用户提供便利的同时,也需要注意确保安全性。在实际开发中,开发者需要权衡用户体验和安全性,合理配置Cookie的相关属性,并采取必要的...

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

    本主题将深入探讨“从ASP到ASP.NET的会话状态管理”,讲解两者之间的异同以及迁移过程中如何处理会话状态。 首先,让我们回顾ASP(Active Server Pages)中的会话状态管理。在ASP中,会话状态主要通过Session对象...

    asp.net宝典/asp.net

    4. **状态管理**:ASP.NET提供多种状态管理机制,如视图状态(ViewState)、隐藏字段、会话(Session)和应用程序(Application)状态,用于在页面间或用户会话间保存数据。 5. **MVC模式**:ASP.NET MVC是一种基于...

    asp.net大作业

    【ASP.NET大作业】是一个基于ASP.NET技术完成的项目,主要展示了如何利用.NET框架和ASP.NET Web应用程序开发平台来构建一个高效、用户友好的Web应用。这个大作业可能包括了数据库交互、文档管理等多个功能模块,旨在...

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

    ASP.NET中的会话(Session)是Web开发中一个重要的概念,它允许开发者在用户的不同页面请求之间保持数据。本文将详细讲解ASP.NET中会话的应用,帮助你理解其工作机制。 一、什么是会话(Session)? 在Web应用程序...

    asp.net简单用户登录系统

    综上所述,"asp.net简单用户登录系统"涉及到了ASP.NET的多个关键知识点,包括用户验证、表单身份验证、密码安全、会话管理、页面跳转、错误处理、角色管理、用户体验以及安全防范。通过这个项目,开发者可以深入理解...

    asp.net mvc core 集成微信登录功能

    // 用户认证成功后,可以在这里处理登录逻辑,例如保存用户信息或创建会话 // ... return Redirect("/Home/Index"); // 登录成功后的重定向页面 } } ``` 为了展示用户信息,你可能需要调用微信 API 获取用户...

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

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

    .net、asp.net使用qq登录,新浪微博,网易微博登录

    在.NET和ASP.NET开发中,实现QQ登录、新浪微博登录以及网易微博登录的功能是常见的社交网络集成需求。这些功能使得用户可以使用他们在社交媒体平台上的账户直接登录到你的网站,提供了便捷的用户体验并可能增加用户...

    web课件ASP/asp.net/jsp程序设计

    【标题】"Web课件ASP/asp.net/jsp程序设计"涵盖了三种主要的Web开发技术:ASP(Active Server Pages)、ASP.NET以及JSP(JavaServer Pages)。这些技术都是用于构建动态网页和Web应用程序的重要工具。 ASP是微软在...

    ASP.NET的安全登录

    ASP.NET是微软开发的一种用于构建Web应用程序的框架,它提供了丰富的功能和强大的工具来帮助开发者创建动态、数据驱动的网站。在ASP.NET中,安全登录是任何web应用的基础,确保只有授权用户能够访问受保护的资源。...

    用asp.net做的一个简单的多用户blog系统

    4. Login.aspx:用户登录页面,用于验证用户凭据并实现会话管理。 5. Web.Config:这是ASP.NET应用程序的核心配置文件,包含了应用程序设置、数据库连接字符串、身份验证和授权规则等信息。 6. Region.aspx.cs、...

    ASP.net从入门到实践

    【ASP.NET从入门到实践】 ASP.NET是微软公司推出的一种用于构建Web应用程序的框架,它构建于.NET Framework之上,提供了全面的开发环境,用于创建高效、功能丰富的网站和Web应用程序。.NET Framework是一个完整的...

    .net C# 利用session控制用户重复登录及统计在线用户数解决方案

    它允许开发者在用户浏览器会话期间保持特定数据,这对于处理用户登录、防止重复登录以及统计在线用户数等场景非常有用。本解决方案的核心就是巧妙地利用了`Session`对象的功能。 首先,我们来理解`Session`的基本...

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

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

    C# ASP.NET - 用户单点登录

    在C# ASP.NET框架下,我们可以利用.NET的内置特性以及数据库管理来实现SSO。以下将详细介绍这两种实现方法。 ### 方法1:使用Cache和Session **Cache**是ASP.NET中用于存储全局性数据的一种机制,它可以存储大量的...

    ASP.NET 2.0实现防止同一用户同时登陆

    在 ASP.NET 2.0 开发环境中,确保用户的会话安全是非常重要的一个方面。本文将详细介绍如何通过 ASP.NET 2.0 实现防止同一用户同时登录的功能,并提供具体的代码示例。 #### 一、背景介绍 在实际的应用场景中,...

Global site tag (gtag.js) - Google Analytics