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

刚开始摸索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 OnActionExecuted(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 FormsAuthenticationTicket
 2 (
 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);

时间: 2024-08-01 10:30:49

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

mvc中利用Attribute特性来进行进行简单的登陆验证

前段时间一直比较忙.好不容易忙完.闲的没事干,就捣腾了下mvc(ef),因为以前都是用三层框架来进行开发,mvc用的也不是很多...众所周知,在三层里面我们一般都是建一个基类,然后在基类里面写验证登录方法,然后在需要验证登录的页面继承这个基类即可...但到了mvc里面所有的视图页面的操作都转移到了控制器了..这个时候我们在按照三层的方式建一个基类来继承验证登录,就没办法走通了...今天我就给大家来展示一个利用Attribute特性来验证登录.如果还有不知道这个东东的,可以百度一下Attribut

编写高质量代码改善C#程序的157个建议——建议55:利用定制特性减少可序列化的字段

建议55:利用定制特性减少可序列化的字段 特性(attribute)可以声明式地为代码中的目标元素添加注释.运行时可以通过查询这些托管块中的元数据信息,达到改变目标元素运行时行为的目的.System.Runtime.Serialization命名空间下,有4个这样的特性: OnDeserializedAttribute,当它应用于某方法时,会指定在对象反序列化后立即调用此方法. OnDeserializingAttribute,当他应用于某方法是,会指定在反序列化对象时调用此方法. OnSeri

利用BFC特性实现两栏自适应

有时候我们在CSS布局的时候需要实现两栏布局,且其中一栏的宽度不固定.据我的经验,有以下几种方法: inline-block 首先两个元素不跨行,又要可以设置宽高,当然是inline-block,但是用此方法有个非常大的缺陷,就是width属性不好设置 js计算 百分比计算 calc属性 Float + overflowHidden 这种方式利用BFC特性 flex 具体看代码.

使AJAX调用尽可能利用缓存特性

优化网站设计(十四):使AJAX调用尽可能利用缓存特性 前言 网站设计的优化是一个很大的话题,有一些通用的原则,也有针对不同开发平台的一些建议.这方面的研究一直没有停止过,我在不同的场合也分享过这样的话题. 作为通用的原则,雅虎的工程师团队曾经给出过35个最佳实践.这个列表请参考  Best Practices for Speeding Up Your Web Site http://developer.yahoo.com/performance/rules.html,同时,他们还发布了一个相应

利用RBAC模型实现一个通用的权限管理系统

本文主要描述了一个通用的权限系统实现思路与过程.也是对此次制作权限管理模块的总结. 制作此系统的初衷是为了让这个权限系统得以“通用”.就是生产一个web系统通过调用这个权限系统(生成的dll文件),就可以实现权限管理.这 个权限系统会管理已生产系统的所有用户,菜单,操作项,角色分配,权限分配,日志等内容. 实现此功能从正常访问和非法访问两个方面入手.正常访问即用户登录系统后只能看到或操作自己拥有的菜单:非法访问即通过拼写url等途径访问系 统的某个功能:所以程序除了实现用户登录后获取用户拥有的菜

利用docker 最新漏洞渗透--提取root 权限

一.事出 近期乌云漏洞平台等科技新闻,爆出Docker虚拟化 端口漏洞,本着热爱开源,实践动手的精神,我也去尝试了下,漏洞严重性确实很高,可以拿到root 登陆账户. 二.还原 2.1 通过扫描,我们找到了一些主机,下面是其中一台运行了docker 主机的服务器,并且开了ssh 端口 知道了22端口后,我们后面会利用此端口来使用root免密码登陆该主机. 2.2 我们可以利用2375 端口做什么? 看到上面的信息后,我们就知道,可以管理该主机上的docker 容器了,启动.停止.创建.下载镜像.

构建基于CXF的WebService服务(3)-- 利用拦截器实现权限验证

CXF中的拦截器分为in拦截器和out拦截器,又有客户端拦截器和服务端拦截器. 拦截器使用流程:客户端(out)-> 服务端(in)->处理业务->服务端(out)->客户端(in),并不是每一步都需要拦截器.在这里我们用到的是客户端Out拦截器和服务端in拦截器.服务端in拦截器检查用户级权限,客户端out浏览器发送用户信息给服务端. 1.创建服务端验证 JaxWsServerFactoryBean或Endpoint都可以通过getInInterceptors方法,向WebSer

[Java]利用拦截器和自定义注解做登录以及权限验证

1.自定义注解 需要验证登录的注解 package com.etaofinance.wap.common; import java.lang.annotation.Documented; import java.lang.annotation.ElementType; import java.lang.annotation.Inherited; import java.lang.annotation.Retention; import java.lang.annotation.Retention

spring4.0.6最新稳定版新特性学习,注解自动扫描bean,自动注入bean(二)

Spring4.0的新特性我们在上一章已经介绍过了.包括它对jdk8的支持,Groovy Bean Definition DSL的支持,核心容器功能的改进,Web开发改进,测试框架改进等等.这张我们主要介绍spring4.0的自动扫描功能,以及对bean的过滤等特性进行学习. 好吧,废话少说,我们来看看代码吧. package com.herman.ss.test; import org.springframework.context.ApplicationContext; import org