ASP.NET MVC如何做一个简单的非法登录拦截

摘要:做网站的时候,经常碰到这种问题,一个没登录的用户,却可以通过localhost:23244/Main/Index的方式进入到网站的内部,查看网站的信息。我们知道,这是极不安全的,那么如何对这样的操作进行拦截呢,这里记录我学到的一个小小方法。

以下是我要记录的正文部分:

  开始讲之前声明一点,我目前的能力着实很有限,有些东西并不很懂,也可能讲不清楚,有些知识表述可能是错误的(尽量避免),主要是把我对这部分做法的理解记载下来,以后自己独立开发的时候确保不会忘记。

  非法登录拦截,主要用到的是.net mvc里的过滤器。我们每次在执行一个方法时候,实际上程序会预先对我们设置的一些过滤条件进行验证和判断,而不同的过滤器作用的优先级是不同的,在实现这个拦截功能的时候,用到的主要是全局过滤器(关于过滤器的知识,了解并不深入,不详述)。

具体的处理思路是这样的:我们现在App_Start文件夹下的FilterConfig.cs文件中注册一个全局过滤器,这个全局过滤器的作用是——进行登录授权,也就是检查你这个用户是不是已经登录的合法用户,如果不是,那么你做的任何其他操作,系统都不会响应,而是一直把你堵在登录界面。接下来看一段代码:

代码:

using Console.App_Start;
using System.Web;
using System.Web.Mvc;namespace Console
{public class FilterConfig{/// <summary>/// 注册全局过滤器/// </summary>/// <param name="filters"></param>public static void RegisterGlobalFilters(GlobalFilterCollection filters){//filters.Add(new HandleErrorAttribute());//登录授权filters.Add(new AuthFilter());}}
}

 

上面的代码,主要看这一句  

 filters.Add(new AuthFilter());

 

这句的意思是,我在这里注册了一个名为 AuthFilter的过滤器,每次后台执行某个动作之前,都必须先要通过这个过滤器的审核,审核通过执行某操作,审核不通过有执行某操作。

下面,在App_Start下新建一个名为AuthFilter.cs的类,然后在这里些授权条件,下面看一段代码:

 

代码如下:

using Console.Util;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;namespace Console.App_Start
{public class AuthFilter:ActionFilterAttribute{public override void OnActionExecuting(ActionExecutingContext filterContext){//如果用户未登录,且action未明确标识可跳过登录授权,则跳转到登录页面if (!CacheUtil.IsLogin&&!filterContext.ActionDescriptor.IsDefined(typeof(AuthEscape),false)){const string loginUrl = "~/Main/Login";filterContext.Result = new RedirectResult(loginUrl);}base.OnActionExecuting(filterContext);}}
}

 以上代码只说明核心的拦截功能的实现,至于余下的一些关于过滤器的使用语法之类的知识点,不会讲述,因为我也不知道呀,只知道是这么写的。

重点看下面这一句:

 //如果用户未登录,且action未明确标识可跳过登录授权,则跳转到登录页面if (!CacheUtil.IsLogin&&!filterContext.ActionDescriptor.IsDefined(typeof(AuthEscape),false))

 

 这是一个条件表达式,前一句 CacheUtil.IsLogin 是一个bool类型的值,为true则表示已经登录,为false则表示未登录,!CacheUtil.IsLogin表示未登录的意思,后一句 

filterContext.ActionDescriptor.IsDefined(typeof(AuthEscape),false))

 

 这里重要的其实是这个 AuthEscape,这是一个定义过滤器特性的类,在这个我们只把它作为一个标志,作为一个可以免除登录授权的标志,具体使用是这样的,比如,看下图:

 

我们在执行任何一个方法之前都会经过全局过滤的过滤,只有已经登录的用户才能执行action方法。但是,因为我们的登录信息是在登录之后才被记录的,那我们的登录操作,登录校验的操作不就也被挡在外面了吗,这样一来,岂不是永远无法登录了吗。所以呀,为了解决这个问题,我们就需要给这两个方法每人发一块免检通行证,也就是在他们头上写一个[AuthEscape],只要有了这个标志,那么上面的那句代码就会返回一个true,如果没有,那么就会返回false。假如既没有登录,又没有免检通行证,那么就会被拦在登录界面上。

AuthEscape.cs的代码如下:

代码:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;namespace Console.App_Start
{/// <summary>/// 用于标记无需登录授权验证的Action,无任何实现,在那个action上面标注这个,就可以逃过全局过滤器的过滤/// </summary>public class AuthEscape:ActionFilterAttribute{}
}

 

 是的,这个类里面是空的,因为我们并不需要这里有任何内容,我们只需要在免检的方法上挂上这个类的名字,仅此而已。这一整个流程,可以用如下的示意图来简要表示:

 

关于这部分呢内容就记录到这里了,希望能帮到你哦。

有需要代码的同学,可以在下面留言邮箱,工作日的时候会尽快发给你。

我的QQ邮箱:3074596466@qq.com

转载于:https://www.cnblogs.com/CherishTheYouth/p/CherishTheYouth_1123.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/364860.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

无法创建java虚拟机_创建java虚拟机失败的解决方法

创建java虚拟机失败的解决方法解决问题的步骤&#xff1a;1、从eclipse文件夹中打开eclipse.ini文件2、修改–launcher.XXMaxPermSize属性3、将值改为512m即可配置文件格式&#xff1a;-startupplugins/org.eclipse.equinox.launcher_1.3.0.v20120522-1813.jar--launcher.libra…

Java简述

Java的特点&#xff08;11个关键术语&#xff09;from《Java核心技术I》 1) 简单性 2) 面向对象 3) 分布式 Java有一个丰富的例程库&#xff0c;用于处理像HTTP和FTP之类的TCP/IP协议。Java应用程序能够通过URL打开和访问网络上的对象&#xff0c;其便捷程度就好像访问本地文…

java 泛型嵌套泛型_Java泛型嵌套

package com.study.generics;//泛型的嵌套使用public class GenericsDemo06 {public static void main(String []args) {GenericsComputer computer new GenericsComputer("联想笔记本电脑","联想");GenericsPeople people new GenericsPeople(computer)…

zipkin 服务追踪

服务追踪,就是对请求接口的追踪并保存. 在测试的过程中我们会发现&#xff0c;有时候&#xff0c;程序刚刚启动后&#xff0c;刷新几次&#xff0c;并不能看到任何数据&#xff0c;原因就是我们的spring-cloud-sleuth收集信息是有一定的比率的&#xff0c;默认的采样率是0.1&am…

Drools:基于PHREAK堆栈的评估和向后链接

前一段时间&#xff0c;我写了一篇有关我们新算法的博客&#xff1a; http : //blog.athico.com/2013/11/rip-rete-time-to-get-phreaky.html 有人问我有关新的基于堆栈的系统以及向后链接如何工作的信息。 我在电子邮件中回复了他们&#xff0c;但我认为其他人可能会发现它很…

人月神话阅读笔记02

作者在《人月神话》中对于大型项目总是陷入焦油坑的原因给出了一些令人叹服的解释&#xff0c;其中广为流传的就是“人月神话”。事实上&#xff0c;它的意思是&#xff1a;人月是一个神话——通俗地讲&#xff0c;人月&#xff0c;即工作人员和时间可以替换&#xff0c;二者是…

java form 上传文件_java通过表单进行文件上传的几种方法

上传文件的分类:无论什么方式上传文件,都要用post提交方式一:前端:表单方式上传文件后端:使用上传技术是apache中的Commons-fileupload.jarcommons-io.jarservlet:1.在表单提交的时候把表单中的所有的数据封装给request对象2.通过commons-fileupload的api方法转换request对象中…

[18/11/24]类和对象

1、类和对象 类可以看做是一个模版&#xff0c;或者图纸&#xff0c;系统根据类的定义来造出对象。我们要造一个汽车&#xff0c;怎么样造?类就是这个图纸&#xff0c;规定了汽车的详细信息&#xff0c;然后根据图纸将汽车造出来。 类&#xff1a;class。 对象&#xff1a;Obj…

N76E003---看门狗

看门狗的设置 比较简单&#xff0c;根据芯片手册上的说明进行设置。值得一提的是设置看门狗的寄存器是保护寄存器&#xff0c;所以在写寄存器的时候要解除保护 1 void wtd_init(void)2 {3 TA0xAA;4 TA0x55;5 6 WDCON 0x7; //根据手册 [2:0]位表示中断在多少秒后执…

具有Spring Boot的Spring Integration Standalone应用程序

我之前在博客中写过一种编写独立的Spring Integration应用程序的方法。 Spring Boot使创建此独立应用程序变得更加简单。 简单的流程是轮询USGS服务&#xff0c;以提供有关世界各地地震活动的信息并记录该信息。 使用Spring Integration描述的流程如下&#xff1a; <int:…

java设置jvm内存_浅谈设置JVM内存分配的几个妙招

一、设置JVM内存设置1. 设置JVM内存的参数有四个&#xff1a;-Xmx Java Heap***值&#xff0c;默认值为物理内存的1/4&#xff0c;***设值应该视物理内存大小及计算机内其他内存开销而定&#xff1b;-Xms Java Heap初始值&#xff0c;Server端JVM***将-Xms和-Xmx设为相同…

UITableViewCell出现动画

UITableViewCell出现动画 // 当cell 将要显示的时候调用 - (void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath{cell.transform CGAffineTransformMakeTranslation(self.view.width, 0);[UIView …

小程序如何传数组数据到vs后台中

首先小程序要跟vs运行的状态打通&#xff0c;首先要修改配置&#xff0c;也就是说调试的时候&#xff0c;小程序一使用Post请求后台的方法时就能让vs进入调试状态。 1.修改vs中的配置&#xff0c;注意这个.vs文件&#xff0c;如图&#xff1a; 找到这个文件 然后打开这个文件&a…

js实现QQ、微信、新浪微博分享功能

使用js实现QQ、微信、新浪微博分享功能。 微信分享需要手机扫描二维码&#xff0c;需要对url进行编码。在https协议下&#xff0c;扫描二维码时&#xff0c;浏览器打不开可能是没有安全证书导致的。 js代码&#xff1a; 1 var shareModel {2 3 /**4 * 分享…

使用Spring的Hibernate构建Java Web应用程序

这篇文章将展示如何在Spring环境中使用带有Hibernate ORM的MYSQL DB创建学生注册应用程序。 这是一个简单的应用程序&#xff0c;旨在在注册期间从用户收集输入详细信息&#xff0c;将详细信息保存在MYSQL DB中&#xff0c;并在登录期间对它们进行身份验证。 1.使用Maven模板创…

java单例模式理解_快速理解Java中的五种单例模式

解法一&#xff1a;只适合单线程环境(不好)packagetest;/***authorxiaoping**/public classSingleton {private static Singleton instancenull;privateSingleton(){}public staticSingleton getInstance(){if(instancenull){instancenewSingleton();}returninstance;}}注解:Si…

201771010102 常惠琢 《面向对象程序设计(java)》第十三周学习总结

实验十三 图形界面事件处理技术 实验时间 2018-11-22 1、实验目的与要求 (1) 掌握事件处理的基本原理&#xff0c;理解其用途&#xff1b; (2) 掌握AWT事件模型的工作机制&#xff1b; (3) 掌握事件处理的基本编程模型&#xff1b; (4) 了解GUI界面组件观感设置方法&#xff1…

vue中使用codemirror

https://blog.csdn.net/oumaharuki/article/details/79268498 别人的记载&#xff0c;写的很不错&#xff0c;还有下载的方法 以下是自己使用过的&#xff0c;做出来的例子&#xff1a; 做出来的效果图&#xff1a; 记住使用之前要npm下载哦 npm install vue-codemirror --s…

使用不可序列化的属性序列化Java对象

人们可能有多种原因想要使用自定义序列化而不是依赖Java的默认序列化。 最常见的原因之一是为了提高性能&#xff0c;但是编写自定义序列化的另一个原因是不支持默认序列化机制。 具体来说&#xff0c;如本博文所述&#xff0c;自定义序列化可用于允许将较大的对象序列化&#…

洛谷 P3455 [POI2007]ZAP-Queries (莫比乌斯反演)

题意: 给定a&#xff0c;b&#xff0c;d求gcd(x,y)d的对数(1<x<a,1<y<b) 思路&#xff1a;按照套路来先设f(n)为gcd(x,y)n的对数,g(n)表示为 n | gcd(x,y)的对数,则g(n)∑n|df(d)a/n*b/n f(n)∑n|dg(d)*mu(d/n),令td/n则f(n)∑t1g(t*n)*mu(t)&#xff0c;然后求f(d…