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. Base64 算法原理,以及编码、解码【加密、解密】 介绍

    Base64编码,是我们程序开发中经常使用到的编码方法.它是一种基于用64个可打印字符来表示二进制数据的表示方法.它通常用作存储.传输一些二进制数据编码方法!也是MIME(多用途互联网邮件扩展,主要用 ...

  2. ireport 导出工具类

    Ireport 报表导出 Poi + ireport 导出pdf, word ,excel ,html 格式 下面是报表导出工具类 Ireport 报表导出 Poi + ireport 导出pdf,  ...

  3. Go加密解密之RSA[转]

    安全总是很重要的,各个语言对于通用的加密算法都会有实现.前段时间,用Go实现了RSA和DES的加密解密,在这分享一下.(对于RSA和DES加密算法本身,请查阅相关资料) 在PHP中,很多功能经常是一个 ...

  4. ASP.NET Web API 的简单示例

    Demo1: HTML: <!DOCTYPE html> <html> <head> <meta charset="utf-8" /> ...

  5. SuperSocket 1.6.4 通过FixedHeaderReceiveFilter解析自定义协议

    SuperSocket 提供了一些通用的协议解析工具, 你可以用他们简单而且快速的实现你自己的通信协议: TerminatorReceiveFilter (SuperSocket.SocketBase ...

  6. client/scroll/offset width/height/top/left ---记第一篇博客

    client/scroll/offset width/height/top/left (盒模型为contentBox,定位原点是元素左上角边框最外层的交点) clientWidth  width+左p ...

  7. Android 布局之FrameLayout

    Android 布局之FrameLayout 1 FrameLayout简介 对于FrameLayout,官方介绍是:FrameLayout is designed to block out an a ...

  8. [ML] Naive Bayes for Text Classification

    TF-IDF Algorithm From http://www.ruanyifeng.com/blog/2013/03/tf-idf.html Chapter 1, 知道了"词频" ...

  9. 在Eclipse中进行HotSpot的源码调试--转

    原文地址:http://www.linuxidc.com/Linux/2015-05/117250.htm 在阅读OpenJDK源码的过程中,经常需要运行.调试程序来帮助理解.我们现在已经可以编译出一 ...

  10. Apache+tomcat+mod_jk+centos6.2负载均衡集群配置--转载

    转载地址:http://blog.163.com/chenhui_java/blog/static/17267249420128101191860/ 注: 由于长期受转载毒害,所以本人日志均是原创:其 ...