用程序登录Aps.Net页面

原创 2003年11月26日 19:38:00

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

 

在写Internet应用程序的时候,常常需要处理用户登录的情况。一般来说,对于这种情况,我们是使用程序来模拟用户在Web页面上填写用户名、密码并提交的过程。当用户在Web页面上输入了用户名、密码并提交之后,实际上是触发了一个POST请求,在这个请求中包含有用户名、密码等信息。因此,我们只要在程序中将相关信息封装成一条POST请求,并将它发送给Web Server,基本上就能实现登录了。以MFC为例,下面的这段代码模拟了一个登录过程:

 

   CString strHeaders = _T("Content-Type: application/x-www-form-urlencoded");

   // name = "sam", password = "123", action = "submit"

   CString strFormData = _T("name=sam&password=123&action=submit");

 

   CInternetSession session;

   CHttpConnection* pConnection =

      session.GetHttpConnection(_T("ServerNameHere"));

   CHttpFile* pFile =

      pConnection->OpenRequest(CHttpConnection::HTTP_VERB_POST,

                              _T("FormActionHere"));

   BOOL result = pFile->SendRequest(strHeaders,

      (LPVOID)(LPCTSTR)strFormData, strFormData.GetLength());

 

这个方法对于Asp页面很有效,但对于Asp.Net页面,有时却不起作用,这是为什么呢?

 

研究

 

为了搞清出Asp.Net页面在处理登录时与Asp页面有何区别,我们需要使用Sniffer工具来跟踪Web服务器与浏览器之间的通讯。经过跟踪会发现,Asp.Net页面在用户提交登录信息之后,仍然是使用POST请求将相关信息发送给服务器。所不同的是,处理用户名、密码等信息之外还多了一个__VIEWSTATE。如果在上面代码中的strFormData中加上一个通过Sniffer得到的__VIEWSTATE的话,就能够成功模拟出整个登录过程了。接下来的问题就是,我们应该如何获得这个__VIEWSTATE呢?

 

我们知道,Asp.Net页面有一个ViewState属性,Asp.Net用它来保存页面的状态信息,以便在页面提交失败时,能够恢复页面的状态。它是通过页面中的一个隐藏的域来定义的,如果通过浏览器来View Source的话,可以看到它是如下的一行代码:

 

<input type="hidden" name="__VIEWSTATE" value="dDwtMTI4ODQyNDA1Ozs+lhWR3hjHp3u/496m+cT53Ofw4P4=" />

 

它的value值正是我们所需要的,我们只要从登录页面中解析出这个__VIEWSTATEvalue,我们的问题就能够得到解决了。

 

解决

 

仔细看一下,ViewState的值是经过编码的,先不管它,直接将它从页面中取出,和登录信息一起组成POST请求,发送给Server,结果如何呢?失败了L。对比一下Sniffer的结果和页面中ViewStatevalue,我们会发现,它们之间还是有些许不同的。原来,页面源码中的ViewState值是经过Base64编码的,而当它被发送给Web Server时,为了保证传输的正确,浏览器会将它转换成URL编码,当Web Server接收到ViewState之后,当然会先将它从URL编码解码为Base64编码再交给Asp.Net处理。看来我们需要将ViewState的值在进行一边URL编码处理,这样就能够成功模拟整个登录过程了J

 

参考

 

1.       HOWTO: Simulate a Form POST Request Using WinInet,微软的KB文章,描述了模拟POST请求的实现。

2.       ASP .NET Maintaining the ViewStateViewState的入门知识。

3.       ViewState: All You Wanted to Know,关于ViewState的深入讨论。

4.       ViewState Parser,想看看解码后的ViewState是什么样子吗?试试这个Parser

5.       博客堂中的相关讨论,这是我在解决这个问题的过程中,在博客堂写的Blog

部署APS.NET网站(应用程序)

第一个选项指定发布后是不是可以修改aspx文件,如果勾选,则发布后的网站行为基本与ASP.NET 1.1一致,只要没有增删修改控件,可以直接在服务器上修改aspx文件不用重新发布网站。 第二个...
  • gdaswater
  • gdaswater
  • 2010年06月17日 13:47
  • 1579

APS.NET

什么是 ASP? 微软曾经的服务器端脚本技术 ASP (Active Server Pages) 如今常被称为经典 ASP。 ASP 3.0 是经典 ASP 的最后一个版本。   ASP.NE...
  • gl1987807
  • gl1987807
  • 2011年09月12日 14:19
  • 1621

APS.NET_MVC5学习笔记-视图

在本节中,你要去修改HelloWorldController类,使用视图模板文件,在干净利索地封装的过程中:客户端浏览器生成HTML。 您将创建一个视图模板文件,其中使用了ASP.NET MVC 3...
  • u010502163
  • u010502163
  • 2016年05月10日 21:51
  • 939

详细图解发布aps.net mvc网站项目到IIS的方法

本文详细图解开发好的mvc网站,如何发布到IIS服务器上,请看吧。   1.首先在项目的引用中 找到如下 三个 程序集      System.Web.Mvc  ,System.Web.Rou...
  • ldl22847
  • ldl22847
  • 2011年10月09日 20:47
  • 5297

APS.NET_MVC5学习笔记-入门

入门 运行  Visual Studio 2013开始这个实例。 Visual Studio是一个IDE集成开发环境。就像您使用Microsoft Word来编写文档,你可以使用集成开发环境(IDE)...
  • u010502163
  • u010502163
  • 2016年04月14日 09:23
  • 742

APS.NET页面保存数据方

web页面一次一般显示10行数据为好,但往往很多时候我们从数据库中查出来上万条数据,这个时候我们要在上万条数据中显示10条,那就必须分页。分页的第一问题就是分页数据。   分页数据  ...
  • QQ289172257
  • QQ289172257
  • 2011年11月24日 00:11
  • 1524

asp.net的登录验证方法

如何运用 Form 表单认证 ASP.NET 的安全认证,共有“Windows”“Form”“Passport”“None”四种验证模式。“Windows”与“None”没有起到保护的作用,不推...
  • pplayer
  • pplayer
  • 2012年02月12日 22:53
  • 1089

asp.net跨域单点击登录

asp.net跨域单点击登录
  • qq_35844359
  • qq_35844359
  • 2017年03月18日 10:48
  • 423

APS.NET_MVC5学习笔记 - 将数据从控制器传递给视图

在我们讨论数据库和数据模型之前,让我们先讨论一下如何将数据从控制器传递给视图。控制器类将响应请求来的URL。控制器类是给您写代码来处理传入请求的地方,并从数据库中检索数据,并最终决定什么类型的返回结果...
  • u010502163
  • u010502163
  • 2016年05月10日 21:54
  • 995

APS.NET_MVC5学习笔记 - 控制器

MVC代表: 模型-视图-控制器 。MVC是一个架构良好并且易于测试和易于维护的开发模式。基于MVC模式的应用程序包含: · Models: 表示该应用程序的数据并使用验证逻辑来强制实施业务规则...
  • u010502163
  • u010502163
  • 2016年05月10日 21:49
  • 719
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:用程序登录Aps.Net页面
举报原因:
原因补充:

(最多只允许输入30个字)