在开发过程中,需要用户登陆才能访问指定的页面这种功能,微软已经提供了这个特性。// 摘要://     表示一个特性,该特性用于限制调用方对操作方法的访问。[AttributeUsage(AttributeTargets.Class | AttributeTargets.Method, Inherited = true, AllowMultiple = true)]public class AuthorizeAttribute : FilterAttribute, IAuthorizationFilter但是,美中不足的是,需要微软自带的一些用户验证的东西,比如数据库,配置等等的。常常我们只需要用SESSION或者Cookies去保存用户登录状态的时候,这岂不是杀鸡用牛刀的感觉?那么,我们按照微软官方的这个特性,重写一个属于自己的验证特性类就行了。下面是我常用的自己写的一段代码,希望大家用得开心,如果有异议可以自己修改,代码无版权,哈哈,我们只为共享。下面也提供了一个可以直接引用的DLL,需要.NET 4.0 Framework的支持。下载地址:点击这里下载代码:
using System.Web.Mvc;namespace System
{/// <summary>/// 表示需要用户登录才可以使用的特性/// <para>如果不需要处理用户登录,则请指定AllowAnonymousAttribute属性</para>/// </summary>[AttributeUsage(AttributeTargets.Method | AttributeTargets.Class, Inherited = true, AllowMultiple = true)]public class AuthorizationAttribute : FilterAttribute, IAuthorizationFilter{/// <summary>/// 默认构造函数/// </summary>public AuthorizationAttribute(){String authUrl = System.Configuration.ConfigurationManager.AppSettings["AuthUrl"];String saveKey = System.Configuration.ConfigurationManager.AppSettings["AuthSaveKey"];String saveType = System.Configuration.ConfigurationManager.AppSettings["AuthSaveType"];if (String.IsNullOrEmpty(authUrl)){this._AuthUrl = "/User/Login";}else{this._AuthUrl = authUrl;}if (String.IsNullOrEmpty(saveKey)){this._AuthSaveKey = "LoginedUser";}else{this._AuthSaveKey = saveKey;}if (String.IsNullOrEmpty(saveType)){this._AuthSaveType = "Session";}else{this._AuthSaveType = saveType;}}/// <summary>/// 构造函数重载/// </summary>/// <param name="loginUrl">表示没有登录跳转的登录地址</param>public AuthorizationAttribute(String authUrl): this(){this._AuthUrl = authUrl;}/// <summary>/// 构造函数重载/// </summary>/// <param name="loginUrl">表示没有登录跳转的登录地址</param>/// <param name="saveKey">表示登录用来保存登陆信息的键名</param>public AuthorizationAttribute(String authUrl, String saveKey): this(authUrl){this._AuthSaveKey = saveKey;this._AuthSaveType = "Session";}/// <summary>/// 构造函数重载/// </summary>/// <param name="authUrl">表示没有登录跳转的登录地址</param>/// <param name="saveKey">表示登录用来保存登陆信息的键名</param>/// <param name="saveType">表示登录用来保存登陆信息的方式</param>public AuthorizationAttribute(String authUrl, String saveKey, String saveType): this(authUrl, saveKey){this._AuthSaveType = saveType;}private String _AuthUrl = String.Empty;/// <summary>/// 获取或者设置一个值,改值表示登录地址/// <para>如果web.config中未定义AuthUrl的值,则默认为/User/Login</para>/// </summary>public String AuthUrl{get { return _AuthUrl.Trim(); }set{if (String.IsNullOrEmpty(value)){throw new ArgumentNullException("用于验证用户登录信息的登录地址不能为空!");}else{_AuthUrl = value.Trim();}}}private String _AuthSaveKey = String.Empty;/// <summary>/// 获取或者设置一个值,改值表示登录用来保存登陆信息的键名/// <para>如果web.config中未定义AuthSaveKey的值,则默认为LoginedUser</para>/// </summary>public String AuthSaveKey{get { return _AuthSaveKey.Trim(); }set{if (String.IsNullOrEmpty(value)){throw new ArgumentNullException("用于保存登陆信息的键名不能为空!");}else{this._AuthSaveKey = value.Trim();}}}private String _AuthSaveType = String.Empty;/// <summary>/// 获取或者设置一个值,该值表示用来保存登陆信息的方式/// <para>如果web.config中未定义AuthSaveType的值,则默认为Session保存</para>/// </summary>public String AuthSaveType{get { return _AuthSaveType.Trim().ToUpper(); }set{if (String.IsNullOrEmpty(value)){throw new ArgumentNullException("用于保存登陆信息的方式不能为空,只能为【Cookie】或者【Session】!");}else{_AuthSaveType = value.Trim();}}}/// <summary>/// 处理用户登录/// </summary>/// <param name="filterContext"></param>public void OnAuthorization(AuthorizationContext filterContext){if (filterContext.HttpContext == null){throw new Exception("此特性只适合于Web应用程序使用!");}else{switch (AuthSaveType){case "SESSION":if (filterContext.HttpContext.Session == null){throw new Exception("服务器Session不可用!");}else if (!filterContext.ActionDescriptor.IsDefined(typeof(AllowAnonymousAttribute), true)
&& !filterContext.ActionDescriptor.ControllerDescriptor.IsDefined(typeof(AllowAnonymousAttribute), true)){if (filterContext.HttpContext.Session[_AuthSaveKey] == null){filterContext.Result = new RedirectResult(_AuthUrl);}}break;case "COOKIE":if (!filterContext.ActionDescriptor.IsDefined(typeof(AllowAnonymousAttribute), true)
&& !filterContext.ActionDescriptor.ControllerDescriptor.IsDefined(typeof(AllowAnonymousAttribute), true)){if (filterContext.HttpContext.Request.Cookies[_AuthSaveKey] == null){filterContext.Result = new RedirectResult(_AuthUrl);}}break;default:throw new ArgumentNullException("用于保存登陆信息的方式不能为空,只能为【Cookie】或者【Session】!");}}}}
}然后在Web.Config文件里面加入下面几句用于配置登陆验证的一些信息:<appSettings><add key="AuthUrl" value="/User/Login" /><add key="AuthSaveKey" value="LoginedUser" /><add key="AuthSaveType" value="Session" /></appSettings>使用实例:
//...省略引用
namespace MrHuo.Framework.Blog
{[Authorization]//如果将此特性加在Controller上,那么访问这个Controller里面的方法都需要验证用户登录状态public class UserController:Controller{[AllowAnonymous]//这里是一个特例,有这个特性,表示这个方法不需要验证用户登录状态public ActionResult Index(){//...省略具体代码}//这里的方法需要验证登录状态,以下雷同public ActionResult Create(){//...省略具体代码}}
}

MVC4项目中验证用户登录一个特性就搞定相关推荐

  1. Vue项目中实现用户登录及token验证

    一.什么是token token的意思是"令牌",是服务端生成的一串字符串,作为客户端进行请求的一个标识.当用户第一次登录后,服务器生成一个token并将此token返回给客户端, ...

  2. vue 用户名重复验证_Vue项目中实现用户登录及token验证

    在前后端完全分离的情况下,Vue项目中实现token验证大致思路如下: 1.第一次登录的时候,前端调后端的登陆接口,发送用户名和密码 2.后端收到请求,验证用户名和密码,验证成功,就给前端返回一个to ...

  3. wegame每次登陆都要滑动验证_Vue项目中实现用户登录及token验证

    在前后端完全分离的情况下,Vue项目中实现token验证大致思路如下: 1.第一次登录的时候,前端调后端的登陆接口,发送用户名和密码 2.后端收到请求,验证用户名和密码,验证成功,就给前端返回一个to ...

  4. vue项目中实现用户登录以及token验证

    文章目录 前言 一.总体逻辑图 二.各环节涉及知识点以及代码 1.jwt(这里只说用法,至于为什么用它,详细可查官网) 2.返回token并存入vuex做持久化 3.路由守卫 4.axios请求拦截 ...

  5. 记一次项目中所有用户登录不成功的解决过程

    周日晚上10点钟,公司监控部来电,我负责的A系统全部登录失败,失败提示:由于你循环登录,为了保证B系统的安全,已锁定你的用户名.这意味着晚上加班的那些客服们无法工作了,事情很严重.怎么办,解决吧. 介 ...

  6. MVC4验证用户登录特性实现方法

    在开发过程中,需要用户登陆才能访问指定的页面这种功能,微软已经提供了这个特性. // 摘要:// 表示一个特性,该特性用于限制调用方对操作方法的访问.[AttributeUsage(Attribute ...

  7. Asp.Net使用加密cookie代替session验证用户登录状态 源码分享 欢迎拍砖

    小论坛地址: http://rayyu.5d6d.com/thread-9444-1-1.html 正文: 首先 session 和 cache 拥有各自的优势而存在.  他们的优劣就不在这里讨论了. ...

  8. java开发微信如何维护登录状态_微信小程序中做用户登录与登录态维护的实现详解...

    总结 大家都知道,在开发中提供用户登录以及维护用户的登录状态,是一个拥有用户系统的软件应用普遍需要做的事情.像微信这样的一个社交平台,如果做一个小程序应用,我们可能很少会去做一个完全脱离和舍弃连接用户 ...

  9. SpringBoot项目中集成第三方登录功能

    SpringBoot项目中集成第三方登录功能 引言 1 环境准备 2 代码实现 3 第三方平台认证申请 4 打包和部署项目 5 第三方平台登录认证测试 6 参考文章 引言 最近想把自己在公众号上介绍过 ...

最新文章

  1. bitwarden自建服务器,BitWarden
  2. shell脚本调试工具 bashdb
  3. 5月16日 | 硬核突破,应用革新!阿里云数据库线下活动-北京站开启
  4. linux 下 apache启动、停止、重启命令
  5. c语言中for语句的作用是,c语言中for语句是怎么用的
  6. MYSQL 学习笔记记录整理之二:分组数据
  7. 信捷XC系列PLC-编程
  8. 企业数据防泄漏解决方案的介绍!
  9. 在64位win7上面卸载IE8
  10. 未转变者服务器bug,未转变者BUG问题解决 | 手游网游页游攻略大全
  11. 掘金「跳转外链风险提示」实现思考
  12. 双碳目标下综合能源系统低碳运行优化调度Matlab程序
  13. linux 下安装apache 快速教程
  14. UML图之五——时序图
  15. Python常见习题
  16. 概率论与数理统计-------参数估计-------区间估计------置信区间、枢轴变量
  17. UE4 蒙太奇 组合动画
  18. 敏涵控股集团贵族私人定制:一场探索美学的旅程
  19. Chrome 快速清理某个地址缓存
  20. 新版标准日本语高级_第20课

热门文章

  1. OpenGL HDR渲染
  2. C++ 源代码到可执行代码的详细过程 ?
  3. QT的QStringList类的使用
  4. QML基础类型之real
  5. mysql5.5 配置_MySQL5.5 安装配置方法教程
  6. c++ 获取linux系统信息_linux系统c程序移植
  7. Docker私有仓库管理,删除本地仓库中的镜像
  8. Java使用Tomcat数据源的方式
  9. 通过MULE集成服务的几种方式
  10. struts2之单个文件上传(特别推荐)