用程序登录Aps.Net页面

程序|页面

  在写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的话,可以看到它是如下的一行代码

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

  仔细看一下,ViewState的值是经过编码的,先不管它,直接将它从页面中取出,和登录信息一起组成POST请求,发送给Server,结果如何呢?失败了L。对比一下Sniffer的结果和页面中ViewState的value,我们会发现,它们之间还是有些许不同的。原来,页面源码中的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 ViewState,ViewState的入门知识。

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

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

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

时间: 2024-07-29 17:12:11

用程序登录Aps.Net页面的相关文章

winform-求大神 如何把两个Winform程序合并显示在一个页面 其中一个只有安装包

问题描述 求大神 如何把两个Winform程序合并显示在一个页面 其中一个只有安装包 基于.Net 4.0 开发的 自己做了一个EXE程序A 现在需要把我自己做的和 已有的客户端程序B 合并显示在一个窗口里运行 现在有B的安装包:目前通过添加引用B的DLL 可以把登陆界面和A 显示在一个窗口 ,但是登录就是报错; 希望路过的大神们给指点指点 解决方案 要看报什么错,是不是缺少文件或者配置的问题.用installshield le打包.

用winform应用程序登录网站的解决方案

用winform应用程序登录网站的解决方案 背景: 网站使用Membership机制来验证用户 要求: c/s应用程序要用网站上的用户名和密码登录,同时在c/s端登录后,浏览网站时就无需再重复登录 思路: 1..net网站对用户是否登录的判断依据是:检查浏览器客户端是否存在有效的cookie验证票据,如果在c/s winform中登录的同时,能让用户浏览器生成验证票据,则实现在winform中登录后,浏览网站时无需再重复登录的问题得已解决 具体操作:可在网站上建一个专用页面,功能为验证用户信息合

java-登录前和登录成功的页面Url一样 怎么回事,求大神

问题描述 登录前和登录成功的页面Url一样 怎么回事,求大神 5C 为什么登录界面的Url是****/loginaction.action,登录成功后的页面也是****/loginaction.action?前后url一样,这样我模拟登陆怎么判断是否登录成功了呢 求详解 解决方案 那就是你的代码并没有跳转呀...要是登陆成功肯定要有跳转代码的呀 解决方案二: 看你跳转代码,当你点击登录按钮 跳转的是什么页面. 你可以传一个参数过去.当登录成功,把传的参数在成功页面显示 解决方案三: 判断登陆成功

Web应用程序中的导航页面

本教程将介绍在 NetBeans IDE 6.0 中如何建立页面导航.最初在 IDE 中创建的 web 应用程序,仅使用了简单的两页面间的导航.第一张页面上的按钮能转至第二张页面.而后对应用程序的修改,使其能在运行时根据下拉列表组件的返回值来决定显示哪个页面.您还能学到动态页面导航的一种更高级的替代方法,即在下拉列表中作出选择的瞬间就进行页面导航. 学习本教程需要以下技术和资源: JavaServer Faces 组件/ Java EE 平台 1.2 和 Java EE 5* 1.1 和 J2E

asp net实现跨站登录-asp.net实现跨站登录,并打开登录后的页面

问题描述 asp.net实现跨站登录,并打开登录后的页面 我现在做一个网站,集成多种系统一键登录.第三方系统我无权修改. 现在我用httpwebrequest模拟登录获取到登录成功后的Cookie,打开系统登录后的页面. 使用response输出Cookie,不能修改Cookie的Domain,第三方系统无法识别到Cookie 求求大神给个完美的解决方案吧. 解决方案 不同的域名没法跨域,你说你的第三方系统不能修改,这是办不到的. 解决方案二: 如果你的客户端使用的是windows,一个变通的办

android 代码打开某个程序的权限管理页面

问题描述 android 代码打开某个程序的权限管理页面 android 如何用代码打开以下页面,在线等! 解决方案 http://blog.csdn.net/wike163/article/details/6635032 解决方案二: 编程是一种美德,是促使一个人不断向上发展的一种原动力.

session登陆验证,没有登录返回登陆页面,登陆过直接跳转

问题描述 session登陆验证,没有登录返回登陆页面,登陆过直接跳转 各位大神 我是一个新手,我希望能够得到你们的帮助. 我在写一个页面 那个页面跳到下一个页面时候需要验证是否登陆过,没有登陆直接返回登陆页面.如果登陆过了 就可以进去.能教教我吗.最好能详细点.我知道这个思路,不知道怎么实现. 解决方案 规范点的操作,配置拦截器.需要权限操作的就判断有没有获取标志位(可以用session),有就进入,没有就跳转登录页面,登录之后设置标志位. 解决方案二: 用你使用的语言/框架和"session

jsp-Struts web程序登录问题

问题描述 Struts web程序登录问题 login.jsp User.java public ActionForward execute(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) { String action = request.getParameter("action"); System.out.println("获

急求!android登录密码验证页面源代码

问题描述 急求!android登录密码验证页面源代码 急求!android登录密码验证页面源代码,1369793795@qq.com 解决方案 <?xml version="1.0" encoding="utf-8"?> android:layout_width="match_parent" android:layout_height="match_parent" android:background="