刚开始摸索C# MVC,也只是按图索骥,对C#的特性不是很懂,耐心看完相关文章,对特性的使用有了进一步理解。

1.特性类的命名规范:特性也是一个类,必须继承于System.Attribute类,命名规范为“类名”+Attribute。不管是直接还是间接继承,都会成为一个特性类,特性类的声明定义了一种可以放置在声明之上新的特性。

2.特性的使用:[特性类名(不需要后缀Attribute)(公共属性=值, 公共属性=值...)]放置于类、方法、字段、属性、结构体...前修饰。

  如:

//在Person类上标记ClassMsg特性
[ClassMsg(Msg = "这是关于人的姓名信息的类")]
class Person
{
//在_name字段上应用ClassMsg特性
[ClassMsg("这是存储姓名的字段")]
string _name;
//[ClassMsg("这是读写姓名字段的属性")]
public string Name { get { return _name; } set { _name = value; } }
}

3.特性类的应用限定修饰:

使用AttributeUsage,来控制如何应用新定义的特性,放置于特性类定义前。

[AttributeUsageAttribute(AttributeTargets.All //可以应用到任何元素

,AllowMultiple=true, //允许应用多次,我们的定值特性能否被重复放在同一个程序实体前多次。

,Inherited=false,//不继承到派生

)]

4.特性的应用

(1).net中特性用来处理多种问题,比如序列化、程序的安全特性、防止即时编译器对程序代码进行优化从而代码容易调试等等。

定植特性的本质上是一个类的元素上去添加附加信息,并在运行其通过反射得到该附加信息(在使用数据实体对象时经常用到)

(2)Attribute 作为编译器的指令时的应用

Conditional:起条件编译的作用,只有满足条件,才允许编译器对它的代码进行编译。一般在程序调试的时候使用

DllImport: 用来标记费.net的函数,表明该方法在一个外部的DLL中定义。

Obsolete: 这个属性用来标记当前的方法已经废弃,不再使用

注:Attribute是一个类,因此DllImport也是一个类,Attribute类是在编译的时候实例化,而不是像通常那样在运行时实例化。

CLSCompliant: 保证整个程序集代码遵守CLS,否则编译将报错。

昨天写的《mvc4 利用filters特性来 实现自己的权限验证》  不需要注册全局的Filters来实现,即第2步不需要。全局的Filter所有的请求都会都会触发。

修改为:

mvc4 利用特性类过滤,实现自己的权限验证

1.新建一个特性类AdminAuthorize继承ActionFilterAttribute。重写OnActionExecuting,在执行action前执行,在这里进行权限判断,在switch可定义多种权限。

代码:Filters/AdminAuthorizeAttribute.cs

 1 using System;
 2 using System.Collections.Generic;
 3 using System.Linq;
 4 using System.Text;
 5 using System.Web;
 6 using System.Web.Mvc;
 7 using System.Web.Profile;
 8 using System.Web.Routing;
 9 using System.Web.Security;
10 namespace XyguiMvcApp.Filters
11 {
12     //限制Attribute类的使用
13     [AttributeUsage(AttributeTargets.All, AllowMultiple = true, Inherited = true)]
14     public class AdminAuthorizeAttribute : ActionFilterAttribute
15     {
16         /// <summary>
17         ///  角色
18         /// </summary>
19         private string role = "";
20         /// <summary>
21         /// 摘要:获取或设置用户角色。
22         // 返回结果:用户角色。
23         /// </summary>
24         public string Role
25         {
26             get { return role; }
27             set { role = value; }
28         }
29
30         public override void OnActionExecuting(ActionExecutedContext filterContext)
31         {
32             switch (role)
33             {
34                 case "Admin":   //Admin角色权限检查。
35                     var cookie = System.Web.HttpContext.Current.Request.Cookies[FormsAuthentication.FormsCookieName];
36                     if (cookie != null && FormsAuthentication.Decrypt(cookie.Value).UserData == role)
37                     {
38                         //验证通过
39                     }
40                     else
41                     {
42                         string returnUrl = HttpContext.Current.Request.Url.PathAndQuery;
43                         var url = FormsAuthentication.LoginUrl + "?returnUrl=" + HttpUtility.UrlEncode(returnUrl);
44                         //HttpContext.Current.Response.Redirect(url, true);//进入action
45                         //filterContext.HttpContext.Response.Redirect(url);//进入action
46                         /*filterContext.Result = new RedirectToRouteResult( //不进入action
47                         new RouteValueDictionary
48                         {
49                             { "action", "Login" },
50                             { "controller", "Admin" },
51                             {"returnUrl", returnUrl}
52                         });*/
53                         filterContext.Result = new RedirectResult(url);//不进入action,转到登录页面。
54                     }
55
56                     break;
57                 case "Anyone":  //任何人。
58
59                     break;
60                 case "Guest":  //Guest权限
61
62                     break;
63                 default:
64
65                     break;
66
67             }
68
69         }
70     }
71 }

查看代码

3.在action前添加特性[AdminAuthorize(Role = "Admin")] ,这里断点发现只有第一次调用action才实例化AdminAuthorizeAttribute类,而OnActionExecuted每次调用action都会触发。

如:

 1         [AdminAuthorize(Role = "Anyone")]
 2         public ActionResult Index()
 3         {
 4             return View();
 5         }
 6
 7         [AdminAuthorize(Role = "Admin")]
 8         public ActionResult Main()
 9         {
10
11             return View();
12         }

4.配置web.config

<authentication mode="Forms">
  <forms name=".AuthAdmin" loginUrl="~/Admin/Login" timeout="30" protection="All" path="/Admin" defaultUrl="/Admin/Main" />
</authentication>

5.在登录action,Login注册船票ticket

 1 FormsAuthenticationTicket MyTicket = new FormsAuthenticationTicket2 (3 1,4 admin.UserName+"," + admin.NickName,5 DateTime.Now,6 DateTime.Now.AddMinutes(300),7 true,8 "Admin",9 FormsAuthentication.FormsCookiePath
10 );
11
12 //添加 Cookies
13 string myHash = FormsAuthentication.Encrypt(MyTicket);
14 HttpCookie myCookie = new HttpCookie(FormsAuthentication.FormsCookieName, myHash);
15 Response.Cookies.Add(myCookie);

转载于:https://www.cnblogs.com/xygui/p/5587428.html

mvc4 利用filters特性来 实现自己的权限验证 之二相关推荐

  1. 利用css特性布局页面制作京东特价框

    布局技巧:利用css特性去制作京东价格图框: 类似步骤: 1.首先制作一个四边形的样式,对高度和宽度进行设置,两者设置为0px 2.原来制作一个四边形里面的一个三角形部分采取的是对颜色设置transp ...

  2. 寻宝游戏 - 利用iBeacon特性设计的iOS线下寻宝游戏 - 物联网小游戏

    寻宝游戏 - 利用iBeacon特性设计的iOS线下寻宝游戏 作者简介 科科香,程序员 方向:IoT,方案集成,喜好各种新鲜东东 转载请注明出处 iBeacon简介 iBeacon(下面简称Beaco ...

  3. css3三角形兼容_利用css3特性写出三角形(兼容IE浏览器)

    利用CSS写出三角形的效果 效果如图: 代码如下: .triangle-up { width:0px; height:0px; border-left:10px solid transparent; ...

  4. 利用多态特性,创建一个手机类Phones,定义打电话的方式call,创建三个子类,并在各自的方法中重写方法,编写程序入口main()方法,实现多种手机打电话...

    |--需求说明 利用多态特性,创建一个手机类Phones,定义打电话的方式call,创建三个子类,并在各自的方法中重写方法,编写程序入口main()方法,实现两种手机打电话 |--解题思路 采用简单工 ...

  5. 利用多态特性,编程创建一个手机类Phones,定义打电话方法call()。创建两个子类:苹果手机类IPhone和安卓手机类APhone,并在各自类中重写方法call(),编写程序入口main()方法

    利用多态特性,编程创建一个手机类Phones,定义打电话方法call().创建两个子类:苹果手机类IPhone和安卓手机类APhone,并在各自类中重写方法call(),编写程序入口main()方法, ...

  6. javascript 算法相关,如何利用指针特性求数组并集与交集

    如何利用指针特性求数组并集与交集 javascript计算数组交集,并集,网上有很多,有些书也有介绍, 很多都是写一个set类,再添加一些方法,本质上都是利用了多次循环 我在写这个的时候,也是被别人问 ...

  7. ML之Xgboost:利用Xgboost模型对数据集(比马印第安人糖尿病)进行二分类预测(5年内是否患糖尿病)

    ML之Xgboost:利用Xgboost模型对数据集(比马印第安人糖尿病)进行二分类预测(5年内是否患糖尿病) 目录 输出结果 设计思路 核心代码 输出结果 X_train内容: [[ 3. 102. ...

  8. 利用自定义注解实现权限验证

    思路: 根据自定义注解,给对应权限能够查看到的资源的Controller方法上添加注解(也就是一个权限字符串),权限字符串跟方法是一对多的关系,同一个权限字符串可以添加到多个方法上:当用户有对应的权限 ...

  9. HDFS的特性,hdfs的安全模式,Hdfs的文件权限验证

    HDFS的特性 HDFS的优点 1.海量数据存储: HDFS可横向扩展,其存储的文件可以支持PB级别或更高级别的数据存储. 2.高容错性:数据保存多个副本,副本丢失后自动恢复.可构建在廉价的机器上,实 ...

最新文章

  1. dataframe python格式_python3.6 pandas,Series和DataFrame基础格式与用法,附代码实例
  2. Google和eBay在建设微服务生态系统中的深刻教训
  3. java发送邮件所需jar包_javamail 发邮件所需jar 包两个 activation.jar,mail.jar | 学步园...
  4. 设计思路工作笔记-使用当天时间戳的差值读取实时数据绕过错误数据
  5. 海报psd素材模板|周年海报,仪式感值得珍藏
  6. 欢迎转载中国网站排名
  7. Destroy与DestroyImmediate以及引发的bug
  8. 年底了,到底要不要跳槽?
  9. 阿里云云计算 34 RDS的概念
  10. 微信小程序 选项卡demo
  11. 如何选择外贸网站服务器?
  12. 关于微信支付预下单【统一下单】“操作超时”问题
  13. 基于C++(QT框架)设计的网络摄像头项目(支持跨平台运行)
  14. Rect、RectF方法解析
  15. 基于Web的个人网页响应式页面设计与实现 HTML+CSS+JavaScript(web前端网页制作课作业)
  16. Relative Ranks问题的两种实现
  17. Git分支管理及命名规范
  18. ora-01172 ora-01151的处理
  19. ambari中zookeeper报错,Connection failed: Expected response imok, Actual response to...
  20. 机器学习_KNN实验(手写数字的识别)

热门文章

  1. webpack学习(七)打包压缩图片
  2. day08 MapReduce
  3. window安装swagger editor
  4. 20145233《网络对抗》Exp8 Web基础
  5. 如何让一个对话框全屏对话框
  6. 在Spark中自定义Kryo序列化输入输出API(转)
  7. PHP 如何准确取得服务器地址IP[非代理]
  8. [转]application.properties详解 --springBoot配置文件
  9. rpm包时遇到Header V3 DSA signature: NOKEY时解决办法
  10. 智慧城市建设面临“三座大山” 安全与服务需两手抓