用程序登录Aps.Net页面
2003-11-26 19:38
246 查看
问题[/b]
在写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页面,有时却不起作用,这是为什么呢?
研究[/b]
为了搞清出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值正是我们所需要的,我们只要从登录页面中解析出这个__VIEWSTATE的value,我们的问题就能够得到解决了。
解决[/b]
仔细看一下,ViewState的值是经过编码的,先不管它,直接将它从页面中取出,和登录信息一起组成POST请求,发送给Server,结果如何呢?失败了L。对比一下Sniffer的结果和页面中ViewState的value,我们会发现,它们之间还是有些许不同的。原来,页面源码中的ViewState值是经过Base64编码的,而当它被发送给Web Server时,为了保证传输的正确,浏览器会将它转换成URL编码,当Web Server接收到ViewState之后,当然会先将它从URL编码解码为Base64编码再交给Asp.Net处理。看来我们需要将ViewState的值在进行一边URL编码处理,这样就能够成功模拟整个登录过程了J。
参考[/b]
1. HOWTO: Simulate a Form POST Request Using WinInet,微软的KB文章,描述了模拟POST请求的实现。
2. ASP .NET Maintaining the ViewState,ViewState的入门知识。
3. ViewState: All You Wanted to Know,关于ViewState的深入讨论。
4. ViewState Parser,想看看解码后的ViewState是什么样子吗?试试这个Parser。
5. 博客堂中的相关讨论,这是我在解决这个问题的过程中,在博客堂写的Blog。
在写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页面,有时却不起作用,这是为什么呢?
研究[/b]
为了搞清出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值正是我们所需要的,我们只要从登录页面中解析出这个__VIEWSTATE的value,我们的问题就能够得到解决了。
解决[/b]
仔细看一下,ViewState的值是经过编码的,先不管它,直接将它从页面中取出,和登录信息一起组成POST请求,发送给Server,结果如何呢?失败了L。对比一下Sniffer的结果和页面中ViewState的value,我们会发现,它们之间还是有些许不同的。原来,页面源码中的ViewState值是经过Base64编码的,而当它被发送给Web Server时,为了保证传输的正确,浏览器会将它转换成URL编码,当Web Server接收到ViewState之后,当然会先将它从URL编码解码为Base64编码再交给Asp.Net处理。看来我们需要将ViewState的值在进行一边URL编码处理,这样就能够成功模拟整个登录过程了J。
参考[/b]
1. HOWTO: Simulate a Form POST Request Using WinInet,微软的KB文章,描述了模拟POST请求的实现。
2. ASP .NET Maintaining the ViewState,ViewState的入门知识。
3. ViewState: All You Wanted to Know,关于ViewState的深入讨论。
4. ViewState Parser,想看看解码后的ViewState是什么样子吗?试试这个Parser。
5. 博客堂中的相关讨论,这是我在解决这个问题的过程中,在博客堂写的Blog。
相关文章推荐
- 在IIS中访问APS页面时提示:“最可能的原因使用的托管的处理程序,但是未安装或未完整安装asp.net“
- 在IIS中访问APS页面时提示:“最可能的原因使用的托管的处理程序,但是未安装或未完整安装asp.net“
- 在IIS中访问APS页面时提示:“最可能的原因使用的托管的处理程序,但是未安装或未完整安装asp.net“
- ASP.NET页面下载程序
- 黑马程序员-ADO.NET登录页面中的错误次数过多禁止登陆
- ASP.NETMVCView页面内判断是否登录
- PHP实例程序:用PHP制作登录页面程序
- 在ASP.NET登录页面中如何实现文本框焦点自动跳转及通过回车键提交表单
- 利用asp.net制作登录页面
- asp.net 截取页面程序
- HOWTO:使ASP.NET网站Forms验证可以指定多个登录页面
- asp.net 利用jquery让登录页面垂直居中显示
- asp.net程序 用户 'NT AUTHORITY/NETWORK SERVICE' 登录失败解决两个方法
- asp.net实现页面的一般处理程序(CGI)学习笔记
- ASP.NET 2.0 页面状态持续程序
- asp.net实现页面的一般处理程序(CGI)学习笔记
- asp.net 判断每个页面是否登录解决方案
- ASP.NET 应用程序级 验证用户是否登录 一般处理程序
- asp.net中的窗体身份验证(完整篇之三:用户登录页面)
- ASP.NET MVC 3.0:基于Ajax的表单提交,A页面认证失败后页面被强转至登录页面,待登录成功将如何回到A页面?