昨天晚上看了视频,今天早上起来就凭着记忆与视频里的代码试着做了一个登陆,基本功能是实现了。

0x0:首先,第一步是做一个界面。。。。直接扒别人做好的页面。。。。。各种改改路径啥的,用浏览器打开,恩,发现基本界面是对的就ok

0x1:解决验证码。添加一个一般处理程序ValidateCode。直接封装好了一个类,具体是使用GDI+实现的。类里面的方法直接返回了image/jpeg。然后在aspx界面代码里面加上JS代码,为验证码图片注册点击事件,每点击一次,就将src属性改变一次(在后面加1),重新请求一次。同时在这个一般处理程序实现的接口加上IRequiresSessionState,这个接口转到定义后发现是空的,就是起到一个标志的作用,可以使用Session。在ValidateCode.ashx的代码后面加上  context.Session["ValidateCode"] = strCode;  将这次生成的验证码记录到本次会话中。

0x2:Cookie。第一次请求的话,就将上次登录的用户名放到文本框中。

if (!IsPostBack)
            {
                //第一次请求从cookie中拿到上次登陆的用户名,并放到文本框中
                LastLoginName = Request.Cookies["UserName"] == null ? string.Empty : Request.Cookies["UserName"].Value;
            }

0x3:如果是IsPostBack的话,意味着这是一次登录请求,首先将现在登录的用户名写入cookie中:Request.Cookies["UserName"].Value = Request["txtClientID"];

然后校验验证码:

string requestCode = Request["txtCode"];
string sessionCode = Session["ValidateCode"] == null ? string.Empty : Session["ValidateCode"].ToString();
Session["ValidateCode"] = null;//匹配一次就清空

获得用户输入的验证码,存在会话中的验证码,然后清空会话中的验证码。

然后就可以拿这两个验证码进行校验,如果相同且都不为空,意味着验证码正确,可以进行用户名和密码的校验;如果两次验证码不一样或者为空,意味着验证码校验失败。(ps:为什么要清空会话中的验证码呢?是为了防止暴力破解,如果不清空的话,可以伪造http请求不停地试验证码。Burp Suite就可以很轻松的做到爆破~);

如果验证失败,可以在前台弹出一个提示。为了方便,直接在前台预留一个坑   <%= ShowMsg %>,在后台代码中添加属性ShowMsg。这样需要在这个坑里面写什么样的代码就都可以了。例如:(<script>alert('验证码输入失败!');</script>);

0x4:验证用户名密码就太简单了,BLL层里直接调用自己写的方法就ok了,方法返回结果是一个List<T>集合。如果成功了就直接Response.Redirect()跳转到后台主页面就行了,并且将这次成功的List<T>中的元素添加到Session中。失败的话就在ShowMsg坑里面弹弹弹,弹走鱼尾纹~

0x5:问题来了,我们登陆成功了就能跳转到主页面了,可是我们不登陆,直接在浏览器地址栏里面输入地址也是一样可以到达主页面的,这尼玛登陆就没有任何意义了,所有一定要做验证,如果不是登陆成功的会话请求就直接让他滚去登陆,直接Response.Redirect()到登陆页面。后台这样需要验证是否是登陆进来的请求实在是太多了,而且为了方便,我们直接生成一个类。

具体如何做?我们发现我们生成的aspx的Web窗体程序都是集成自System.Web.UI.Page类的。我们可以让我们自己生成的类集成System.Web.UI.Page这个类,然后让我们那些需要验证会话的那些web窗体继承我们自己生成的类,这样就相当于在web窗体和System.Web.UI.Page之间加了一层东西,我们就在这个加的一层里面动手脚。

我们在这个类里面加上一个属性。因为我们前面在Session内存里面储存的是list<T>里的元素,所以我们增加的属性的类型就是T,用来校验是否存在会话。代码如下:

public Model.HKSJ_USERS CurrentLoginUsers { get; set;}

protected void Page_Init(object sender, EventArgs e)
        {
            CurrentLoginUsers = Session["LoginUser"] as Model.HKSJ_USERS;
            if (CurrentLoginUsers==null)
            {
                Response.Redirect("Login.aspx");
            }
        }

Page_Init 事件代表的是页面初始化,比Page_Load发生的还要早。web窗体继承了这个类,所以他们在页面初始化的时候就会校验是否存在会话。

0x6:在视频里面看到,会话过期的话,iframe标签跳转的话,会在iframe的地方直接跳转到登陆页面,形成嵌套的效果,简直丑陋!!以前入侵网站放上的大马,就是这样,一段时间不操作,就会那样嵌套,当时就觉得简直shit!!

我先是登陆进了后台,然后重新生成,按理说Session已经断开了,我也应该遇到那样的情况才对啊,可是现实不是这样的,我在后台还能继续操作,直接在浏览器地址栏Get请求才会跳转到登陆界面,由此可见,我的Session也是断开了才对啊~难道我在后台的那些操作没有经过Page_Init吗?可是视屏里面就是嵌套跳转了的啊?算了,我也不钻牛角尖了,以后肯定还会遇到的,现在先把解决方案贴出来:

<%--<script type="text/javascript">
    if (window != window.top.window) {
        window.top.window.location.href = "/Admin/Login.aspx";
    }
</script>--%>

跳转的时候先看看自己是不是顶级窗口,如果不是,就让顶级窗口跳到登陆界面;如果是,那还费什么话啊,赶紧跳啊!

第一次写这样的博客,思路还是很乱的。。。写之前,我的思路还要更混乱,写着写着,思路渐渐的就理顺了一些,果然写博客还是有用处的!还有,就是花的时间有点多,不过这样的总结我觉得还是很有必要的。

ASPNET登陆总结的更多相关文章

  1. Microsoft.AspNet.Identity 的简单使用

    要完成一个简单的注册,登陆,至少需要实现Identity中的3个接口 IUser IUserStore<TUser> : IDisposable where TUser : IUser I ...

  2. asp.net.core网站重启后登陆无效问题(部署在IIS)

    一.问题 在使用asp.net.core时,把网站发布到IIS后,在后续更新中需要停止网站,然后重启网站,发现已经登陆的用户会退出登陆.过程如下 1.登陆代码(测试) [AllowAnonymous] ...

  3. Aspnet Mvc 前后端分离项目手记(四)vue项目的搭建(一)(iview)

    一项目创建 1,搭建vue-cli脚手架(依赖npm) 没有安装npm的同学,请先使用npm install -g vue-cli ,然后再进行这一步 安装的过程中有几项 ? Project name ...

  4. Asp.Net MVC 5使用Identity之简单的注册和登陆

    由于.Net MVC 5登陆和注册方式有很多种,但是Identity方式去实现或许会更简单更容易理解 首先新建一个项目 其次如下选择Empty和MVC的选项 然后打开NuGet包管理器分别安装几个包 ...

  5. [linux]阿里云主机的免登陆安全SSH配置与思考

    公司服务器使用的第三方云端服务,即阿里云,而本地需要经常去登录到服务器做相应的配置工作,鉴于此,每次登录都要使用密码是比较烦躁的,本着极速思想,我们需要配置我们的免登陆. 一 理论概述 SSH介绍 S ...

  6. Python 爬虫模拟登陆知乎

    在之前写过一篇使用python爬虫爬取电影天堂资源的博客,重点是如何解析页面和提高爬虫的效率.由于电影天堂上的资源获取权限是所有人都一样的,所以不需要进行登录验证操作,写完那篇文章后又花了些时间研究了 ...

  7. 调用AJAX做登陆和注册

    先建立一个页面来检测一下我们建立的用户名能不能用,看一下有没有已经存在的用户名吗 可以通过ajax提示一下 $("#uid").blur(function(){ //取用户名 va ...

  8. Android调用微信登陆、分享、支付

    前言:用了微信sdk各种痛苦,感觉比qq sdk调用麻烦多了,回调过于麻烦,还必须要在指定包名下的actvity进行回调,所以我在这里写一篇博客,有这个需求的朋友可以借鉴一下,以后自己别的项目有用到也 ...

  9. 如何将VCSA添加到微软域控环境,并且实现微软域账号登陆vCenter

    v:* { } o:* { } w:* { } .shape { } p.msonormal,li.msonormal,div.msonormal { margin: 0cm; margin-bott ...

随机推荐

  1. 在Qt中使用sleep

      关于sleep函数,我们先来看一下他的作用:sleep函数是使调用sleep函数的线程休眠,线程主动放弃时间片.当经过指定的时间间隔后,再启动线程,继续执行代码.sleep函数并不能起到定时的作用 ...

  2. scala中常用但其他语言不常见的符号含义

    本文旨在介绍Scala在其他语言中不太常见的符号含义,帮助理解Scala Code. 随着我对Scala学习的深入,我会不断增加该篇博文的内容. 修改记录 ----2016.11.23  新增scal ...

  3. Badge分析&如何逼死处女座

    Badge分析 所谓Badge,原本是iOS上的一个效果,但是被Android抄的多了,也就成了Android的标配.图就不上了,大家都懂的. 应用icon显示角标实际上是在Launcher中实现的, ...

  4. Android常用功能代码块(转)

    1.设置activity无标题,全屏 // 设置为无标题栏 requestWindowFeature(Window.FEATURE_NO_TITLE); // 设置为全屏模式 getWindow(). ...

  5. JSON 遍历转为Model Bean

    @RequestMapping(value = "/batchAddPageIndexBrand") @ResponseBody public HashMap<String, ...

  6. .Net操作XML文件

    //设置配置文件物理路径 public string xmlPath = "/manage/spider/config.xml"; protected void Page_Load ...

  7. 【USACO 3.1.6】邮票

    [描述] 已知一个N枚邮票的面值集合(如,{1分,3分})和一个上限K ——表示信封上能够贴K张邮票.计算从1到M的最大连续可贴出的邮资. 例如,假设有1分和3分的邮票:你最多可以贴5张邮票.很容易贴 ...

  8. hdu1142 A Walk Through the Forest( Dijkstra算法+搜索)

    看到这道题,想起了我家旁边的山! 那是一座叫做洪山寨的山,据说由当年洪秀全的小妾居住于此而得名! 山上盛产野果(很美味)! 好久没有爬上去了! #include<stdio.h> #inc ...

  9. C++ Primer 5th 第16章 模板与泛型编程

    模板是C++中泛型编程的基础,一个模板就是创建一个类或者函数的蓝图或者说公式. C++模板分为函数模板和类模板. 类模板则可以是整个类是个模板,类的某个成员函数是个模板,以及类本身和成员函数分别是不同 ...

  10. 08_linux下安装chrome

    首先下载chrome,需要改hosts哦(o(^▽^)o,别告诉我你不会,可以问度娘.谷哥哦) 下载地址:https://dl.google.com/linux/direct/google-chrom ...