1.前言

  a.微软对ASP.NET的开发从WebForm到MVC的转变,已经正式过去5,6个年头,现在WebForm和MVC也都越来越完善,小小算来我也已经工作了将近三年,从大学的时候学习ASP.NET WebForm,感觉这就是我们以后吃饭的技术,所以当时可劲的学习拖各种控件,学习做各种各样的小项目,但是没想到的是,从大学最后一学期参加实习开始到现在也就一直没有机会接触ASP.NET WebForm,基本也都是在用MVC开发。我并不是说MVC就比WebForm开发好或者什么的,我只是觉得他们都是工具,只要我们使用任何一种工具能够顺手,能给我们带来更快速的开发和收获,我们就可以去使用它。

  b.那么MVC也同时给我们带来了不一样的开发体验,它增加了很多的开发技巧和技术,比如:路由机制(Web Form也已加入),Razor引擎,特性(Attribute)等,随着Visual Studio2015的发布,ASP.NET MVC6的跨平台也已经来到,那么说了这么多,我们今天主要的还是简单说一下MVC的特性,我将这些经常用到的技术都给整理起来,等到我们后面有机会用到的时候直接将其拿出来使用即可。

  c.源码(Git)地址:https://github.com/kencery/Common/blob/master/KenceryCommonMethod/AuthorizeAttribute/LoginAttribute.cs

2.AuthorizeAttribute登录特性解释

  a.在项目开发中,通常我们都会涉及到用户登录才能访问的网页,比如购物网站,我们浏览商品,添加购物车(以前开发的时候在这里就需要登录用户,但是现在有了缓存的实现,这里可以将商品加入缓存,等到结账的时候在登录)选择结账的时候需要登录,那么这时候我们需要跳转到登录页面登录,登录之后还可以回到记录下来的原始的页面,那么这之后我们有好几种方法可以实现这种效果,简单举例:

    (1):第一种:登录模块不管怎么样都是统一的,就是在每个需要登录的方法里面判断用户是否登录,如果没有登录,则跳转登录,这种的缺点是工作量大,代码冗余。

    (2):第二种:使用MVC的特性,定义类继承IAuthorizationFilter,重写OnAuthorization方法即可实现。此方法工作量少,代码不冗余,如果需要登录我们只需要给Controller或者Action给上标签即可。

  b.任何能够使用特性的判断都可以按照下面的思路来实现,例如(登录判断,权限判断,请求判断,去除空格,读取返回路径)等等,在项目中又遇到这些方方面面需要在请求发起之前或者请求发起之后访问的,都可以实现特性去实现。

  c.下面是我简单整理的的a中说的这种需要的特性实现,代码示例如下,请查看:

3.代码示例

  a.下面我简单说一下这个实现的思路,如果大家有什么意见可以在底下留言,纯属于整理,没多少技术含量,请大家见谅,如果代码不能实现你们的需求,请按照你们的需求更改即可实现。

    (1).首先定义类继承自FilterAttribute, IAuthorizationFilter,会让你实现重写OnAuthorization方法。

    (2).从web.Config中存放三个常量(登录地址,登录Session或Cookie键,Session或者Cookie登录的判断),在构造函数中读取Web.Config中的信息,实现构造函数。

    (3).重写OnAuthorization方法,判断是Cookie或者Session记录用户登录信息,然后判断Session或者Cookie是否为空,如果为空,则登录至指定的地址,否则退出即可。

    (4).使用,如果Controller或者Action需要判断是否登录,则打上特性[Login],否则不需要,如果在某一个Controller中,大部分方法需要,只有一两个不需要,在Controller中打上特性[Login],在不需要的方法上打上特性[AllowAnonymous]即可实现。

  b.上面说了这么多,基本都是一些思路,实现代码示例如下,请查看:

 // 源文件头信息:
// <copyright file="LoginAttribute.cs">
// Copyright(c)2014-2034 Kencery.All rights reserved.
// 个人博客:http://www.cnblogs.com/hanyinglong
// 创建人:韩迎龙(kencery)
// 创建时间:2015-8-7
// </copyright> using System;
using System.Web;
using System.Web.Mvc;
using System.Web.UI.WebControls; namespace KenceryCommonMethod
{
/// <summary>
/// 添加此特性的功能是:需要用户登录才能够浏览网页,如果不需要用户登录,则可以使用AllowAnonymousAttribute属性
/// 使用:给ASP.NET MVC中的控制器类名或者Action方法上面打上[Login]标签
/// 如果不需要验证用户是否登录就可以浏览,则给ASP.NET MVC中的控制器类名或者Action方法上面打上[AllowAnonymous]标签
/// </summary>
/// <auther>
/// <name>Kencery</name>
/// <date>2015-8-7</date>
/// </auther>
[AttributeUsage(AttributeTargets.Method | AttributeTargets.Class, Inherited = true, AllowMultiple = true)]
public class LoginAttribute : FilterAttribute, IAuthorizationFilter
{
/// <summary>
/// 该值表示登录地址:默认路径为user/login,在Web.Config中设置
/// </summary>
private string _authUrl = string.Empty; public string AuthUrl
{
get
{
return _authUrl.Trim();
}
set
{
if (string.IsNullOrEmpty(value))
{
throw new ArgumentNullException("AuthUrl为空,验证用户登录信息的用户登录地址不能为空");
}
_authUrl = value.Trim();
}
} /// <summary>
/// 该值表示yoghurt登录保存登录信息的键名,默认user,在web.Config中设置
/// </summary>
private string _authSaveKey = string.Empty; public string AuthSaveKey
{
get { return _authSaveKey.Trim(); }
set
{
if (string.IsNullOrEmpty(value))
{
throw new ArgumentNullException("AuthSaveKey为空,验证用户登录的时候保存的登录键信息不能为空");
}
_authSaveKey = value.Trim();
}
} /// <summary>
/// 该值表示用户登录保存登录信息的类型,默认Session,在web.Config中设置
/// </summary>
private string _authSaveType = string.Empty; public string AuthSaveType
{
get { return _authSaveType.Trim().ToUpper(); }
set
{
if (string.IsNullOrEmpty(value))
{
throw new ArgumentNullException("AuthSaveType为空,验证用户登录的时候未保存键信息类型,类型不能为空");
}
_authSaveType = value.Trim().ToUpper();
}
} /// <summary>
/// 默认构造函数
/// </summary>
public LoginAttribute()
{
const string authUrl = "/User/Index"; //登录页面路径,从Web.Config中读取
const string saveKey = "user"; //验证(登录存放用户信息),从Web.Config中读取
const string saveType = "Session"; //存放类型判断(Session或者Cookie存放),,从Web.Config中读取
_authUrl = string.IsNullOrEmpty(authUrl) ? "/User/Index" : authUrl; } /// <summary>
/// 构造函数重载
/// </summary>
/// <param name="authUrl"></param>
public LoginAttribute(string authUrl) : this()
{
_authUrl = authUrl;
} /// <summary>
/// 构造函数重载
/// </summary>
/// <param name="authUrl"></param>
/// <param name="saveKey"></param>
public LoginAttribute(string authUrl, string saveKey) : this(authUrl)
{
_authSaveKey = saveKey;
_authSaveType = "Session";
} /// <summary>
/// 构造函数重载
/// </summary>
/// <param name="authUrl"></param>
/// <param name="saveKey"></param>
/// <param name="saveType"></param>
public LoginAttribute(string authUrl, string saveKey, string saveType) : this(authUrl, saveKey)
{
_authSaveType = saveType;
} public void OnAuthorization(AuthorizationContext filterContext)
{
if (filterContext.HttpContext == null)
{
throw new Exception("此特性只试用于Web应用程序试用");
}
var flAd = filterContext.ActionDescriptor;
var url = string.Format("{0}?Ref=/{1}/{2}", _authUrl, flAd.ControllerDescriptor.ControllerName,
flAd.ActionName);
switch (AuthSaveType)
{
case "SESSION":
if (filterContext.HttpContext.Session == null)
{
throw new Exception("服务器Session不可用");
}
if (!filterContext.ActionDescriptor.IsDefined(typeof (AllowAnonymousAttribute), true) &&
!filterContext.ActionDescriptor.ControllerDescriptor.IsDefined(
typeof (AllowAnonymousAttribute), true))
{
if (filterContext.HttpContext.Session[_authSaveKey] == null)
{
filterContext.Result = new RedirectResult(url);
}
}
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(url);
}
}
break;
default:
throw new ArgumentNullException("用户保存登录信息的方法不能为空,只能为Cookie和Session,请您检查");
}
}
}
}

ASP.NET MVC自定义AuthorizeAttribute篇知识点讲解—登录限制的更多相关文章

  1. Asp.net Mvc 自定义Session (二)

    在 Asp.net Mvc 自定义Session (一)中我们把数据缓存工具类写好了,今天在我们在这篇把 剩下的自定义Session写完 首先还请大家跟着我的思路一步步的来实现,既然我们要自定义Ses ...

  2. asp.net mvc 自定义pager封装与优化

    asp.net mvc 自定义pager封装与优化 Intro 之前做了一个通用的分页组件,但是有些不足,从翻页事件和分页样式都融合在后台代码中,到翻页事件可以自定义,再到翻页和样式都和代码分离, 自 ...

  3. ASP.NET MVC 自定义路由中几个需要注意的小细节

    本文主要记录在ASP.NET MVC自定义路由时,一个需要注意的参数设置小细节. 举例来说,就是在访问 http://localhost/Home/About/arg1/arg2/arg3 这样的自定 ...

  4. Asp.net mvc 自定义全局的错误事件HandleErrorAttribute无效

    Asp.net mvc 自定义全局的错误事件HandleErrorAttribute,结果无效, 原因: 1.没有在RegisterGlobalFilters 里面添加或者你要的位置添加. 2.你把这 ...

  5. MVC自定义AuthorizeAttribute实现权限管理

    [转]MVC自定义AuthorizeAttribute实现权限管理 原文载自:小飞的DD http://www.cnblogs.com/feiDD/articles/2844447.html 网站的权 ...

  6. ASP.NET MVC自定义验证Authorize Attribute(包含cookie helper)

    前几天Insus.NET有在数据库实现过对某一字段进行加密码与解密<使用EncryptByPassPhrase和DecryptByPassPhrase对MS SQLServer某一字段时行加密和 ...

  7. ASP.NET MVC 自定义Razor视图WorkContext

    概述 1.在ASP.NET MVC项目开发的过程中,我们经常需要在cshtml的视图层输出一些公用信息 比如:页面Title.服务器日期时间.页面关键字.关键字描述.系统版本号.资源版本号等 2.普通 ...

  8. asp.net MVC 自定义模型绑定 从客户端中检测到有潜在危险的 Request.QueryString 值

    asp.net mvc 自定义模型绑定 有潜在的Requset.Form 自定义了一个模型绑定器.前端会传过来一些敏感字符.调用bindContext. valueProvider.GetValue( ...

  9. asp.net MVC之AuthorizeAttribute浅析

    AuthorizeAttribute是asp.net MVC的几大过滤器之一,俗称认证和授权过滤器,也就是判断登录与否,授权与否.当为某一个Controller或Action附加该特性时,没有登录或授 ...

随机推荐

  1. smartjs 0.3 DataManager 发布&介绍

    在0.3版加入了DataManager,基于策略的数据管理模块:是SmartJS中比较重要的一个系列.整个个DataManager模块包括有:dataManager,dataPolicyManager ...

  2. 解决mysql“Access denied for user 'root'@'localhost'”

    解决mysql“Access denied for user 'root'@'localhost'” 分类: linux 2011-01-14 00:23 147547人阅读 评论(3) 收藏 举报 ...

  3. jquery.uploadify 异常 “__flash__removeCallback”未定义

    使用场景结合artdialog弹出框使用时发生“__flash__removeCallback”未定义,原因在于artdialog基于iframe加载的uloadify,在关闭artdialog的时候 ...

  4. 搭建windows下filezilla FTP服务器

    FTP服务器必不可少,鉴于serv-u越来越冗余繁多的设置,个人还是比较喜欢简单.干净,满足需求即可的东东,所以选择filezilla.更主要的原因是ta是开元免费使用的,虽然免费,功能却齐全,我发现 ...

  5. maven -- 问题解决(二)解决“Could not calculate build plan”问题

    错误提示如下:(eclipse+maven) Could not calculate build plan: Failure to transfer org.apache.maven.plugins: ...

  6. Linux常用命令回顾

    文件操作:ls 查看文件ls -a 查看全部文件,包括隐藏文件(以.开头)ls -l 查看文件的详细信息(ll同样的效果)ls -lh 查看文件的详细信息,人性化显示,文件大小标注单位文件权限-代表文 ...

  7. LeetCode——Jump Game II

    Description: Given an array of non-negative integers, you are initially positioned at the first inde ...

  8. Windows及Linux平台下的计时函数总结

    本文对Windows及Linux平台下常用的计时函数进行总结,包括精度为秒.毫秒.微秒三种精度的各种函数.比如Window平台下特有的Windows API函数GetTickCount().timeG ...

  9. 11.22 点餐APP第一阶段总结

    第一个冲刺结束了,任务也算是完成了. 团队合作不像单独做那样想怎么来就怎么来,各个人都不同的意见,最后方案的需要每个人一致同意通过才能执行. 不过团队合作分配到每个人的任务也相对轻一点,而且遇到问题解 ...

  10. 重构第18天 用条件语句来代替异常(Replace exception with conditional)

    理解:本文中的“使用条件判断代替异常”是指把没有必要使用异常做判断的条件尽量改为条件判断. 详解: 重构前代码: public class Microwave { private IMicrowave ...