ASP.MVC 基于AuthorizeAttribute权限设计案例

ASP.MVC上实现权限控制的方法很多,比如使用AuthorizeAttribute这个特性

1.创建自定义特性用于权限验证

 public class AuthorizeDiy : AuthorizeAttribute
    {
        /// <summary>
        /// 提供一个入口用于自定义授权检查
        /// </summary>
        /// <param name="httpContext"></param>
        /// <returns></returns>
        protected override bool AuthorizeCore(HttpContextBase httpContext)
        {
            bool pass = false;
            HttpCookie cookie = HttpContext.Current.Request.Cookies["admin"];
            if (cookie == null || cookie.Value == null)
            {
                httpContext.Response.StatusCode = 401;
                pass = false;
            }
            else
            {
                pass = true;
            }
            return pass;
        }    

        /// <summary>
        /// 处理未能授权的Http请求
        /// </summary>
        /// <param name="filterContext"></param>
        protected override void HandleUnauthorizedRequest(AuthorizationContext filterContext)
        {
            base.HandleUnauthorizedRequest(filterContext);
            filterContext.HttpContext.Response.Write(filterContext.HttpContext.Response.StatusCode);
            if (filterContext.HttpContext.Response.StatusCode == 401)
            {
                //跳转到登录界面
                filterContext.Result = new RedirectResult("/Login");
            }
        }
    }

重写2个方法用于验证处理授权请求和授权失败。

2.创建控制器基类便于其他控制器继承

   [AuthorizeDiy]
    public class BaseAdminController:Controller
    {
    }

注意使用自定义特性

3.登录控制器的写法

    /// <summary>
    /// 登录控制器
    /// </summary>
    public class LoginController : BaseAdminController
    {
        //
        // GET: /Login/
        [AllowAnonymous]
        public ActionResult Index()
        {
            return View();
        }

        [HttpPost]
        [AllowAnonymous]
        public JsonResult LoginCheck()
        {
            FormsAuthenticationTicket ticket = new FormsAuthenticationTicket(
                      1,
                      "admin",
                      DateTime.Now,
                      DateTime.Now.AddDays(1),
                      true,
                      Newtonsoft.Json.JsonConvert.SerializeObject(new {name="test"}));

            string ticString = FormsAuthentication.Encrypt(ticket);

            HttpCookie cookie = new HttpCookie("admin", ticString);
            Response.Cookies.Add(cookie);
            object result = new { success = true };
            return this.Json(result);
        }
    }

注意:继承基类,并且使用MVC自定义特性进行授权此处只是简单实现。注意:跳转登录和验证登录的2个action必须使用Allowanonymous特性否则登录界面的权限验证无法通过会出现重复定向多次的错误

4.其他页面的Demo

登录视图:

@{
    ViewBag.Title = "Index";
}
<script src="~/Scripts/jquery-1.8.2.min.js"></script>
<h2>这个是登录界面</h2>
<form class="formClass">
    <button>登录</button>
</form>

<script>
    $(function ()
    {
        $(".formClass").submit(function ()
        {
            $.post("/Login/LoginCheck", {}, function (r) {
                alert(JSON.stringify(r));
                if (r) {
                    location.href = "/Home/Index";
                }
                else {
                    alert("登录失败");
                }
            });
            return false;
        })
    })
</script>

主视图:

@{
    ViewBag.Title = "Index";

}

<script src="~/Scripts/jquery-1.8.2.min.js"></script>
<h2>Index</h2>
<script>
    $(function ()
    {

    })
</script>

主页控制器:

  public class HomeController : BaseAdminController
    {
        //
        // GET: /Home/

        public ActionResult Index()
        {
            return View();
        }

    }

5.效果

先正常操作,然后清空缓存,实现权限控制效果,MVC路由指向Home控制器的Index

当进入主页时发现未授权自动跳转至登录界面

时间: 2024-08-11 01:34:43

ASP.MVC 基于AuthorizeAttribute权限设计案例的相关文章

ASP.net MVC 基于角色的权限控制系统的实现

一.引言 我们都知道ASP.net mvc权限控制都是实现AuthorizeAttribute类的OnAuthorization方法. 下面是最常见的实现方式: public class CustomAuthorizeAttribute : AuthorizeAttribute { public override void OnAuthorization(AuthorizationContext filterContext) { if (!filterContext.RequestContext

ASP.NET MVC 基于角色的权限控制系统的示例教程

上一次在 .NET MVC 用户权限管理示例教程中讲解了ASP.NET MVC 通过AuthorizeAttribute类的OnAuthorization方法讲解了粗粒度控制权限的方法,接下来讲解基于角色的权限控制方法. 基于角色的权限控制方法概述 基于角色的权限控制系统RBAC(Role Based Access Control)是目前最流行,也是最通用的权限控制系统.所谓基于角色的权限控制,就是将各个操作权限分组,每一个组就是一个角色,举个例子:管理员拥有所有的权限,编辑就只拥有写文章和发布

ASP.NET MVC +EasyUI 权限设计(二)环境搭建

请注明转载地址:http://www.cnblogs.com/arhat 今天突然发现博客园出问题了,老魏使用了PC,手机,平板都访问博客园了,都是不能正常的访问,原因是不能加载CSS,也就是不能访问common.cnblogs.com这个域名,一直出现"Aborted",非常的郁闷. 页面就是这样子的,不知道为什么,难道是不是我的3个终端有问题吧,还是园子的服务器有问题呢?还是路由器的问题呢?到现在这个问题还没解决,郁闷死了!弄得心情非常的不爽. 好吧,不在说这个问题了,开始我们的正

ASP.NET MVC +EasyUI 权限设计(一)开篇

在前一段时间中,老魏的确非常的忙碌,Blog基本上没有更新了,非常的抱歉,那么在后面的时间中,老魏会尽量的抽时间来写的,可能时间上就不太富裕了.今天开始呢,老魏会和大家分享一下关于权限设计的有关文章,由于在园子中已经有很多人写过这方面的知识了,所以老魏在这里呢可不能班门弄斧了,只是把自己的理解和做法和大家分享一下,如果有什么不对的地方或者可以优化的地方,老魏非常希望能够得到各位的建议. 话说权限是在任何的项目或者产品中都必须要用的模块,而这部分呢基本上是作为基础数据来提供的,为了能够控制各个用户

asp.net mvc +easyui 实现权限管理(二)

一写完后,好久没有继续写了.最近公司又在重新开发权限系统了,但是由于我人微言轻,无法阻止他们设计一个太监版的权限系统.想想确实是官大一级压死人啊, 没办法我只好不参与了 让他们去折腾. 我就大概说一下公司目前在做的权限系统,各位看官给点评价. 设计总体要求: (注:项目名称为 统一权限管理系统) 1.做一个通用权限系统. 2.权限设计按照角色设置. 3.提供统一权限接口 以上就是整体要求,解释一下, 我们的通用是指的以后每开发一套新系统,只需要在统一权限管理系统中进行相应的配置就好了,无需再去开

ASP.NET MVC基于标注特性的Model验证:一个Model,多种验证规则

原文:ASP.NET MVC基于标注特性的Model验证:一个Model,多种验证规则 对于Model验证,理想的设计应该是场景驱动的,而不是Model(类型)驱动的,也就是对于同一个Model对象,在不同的使用场景中可能具有不同的验证规则.举个简单的例子,对于一个表示应聘者的数据对象来说,针对应聘的岗位不同,肯定对应聘者的年龄.性别.专业技能等方面有不同的要求.但是ASP.NET MVC的Model验证确是Model驱动的,因为验证规则以验证特性的形式应用到Model类型及其属性上.这样的验证

ASP.NET MVC基于标注特性的Model验证:将ValidationAttribute应用到参数上

原文:ASP.NET MVC基于标注特性的Model验证:将ValidationAttribute应用到参数上 ASP.NET MVC默认采用基于标准特性的Model验证机制,但是只有应用在Model类型及其属性上的ValidationAttribute才有效.如果我们能够将ValidationAttribute特性直接应用到参数上,我们不但可以实现简单类型(比如int.double等)数据的Model验证,还能够实现“一个Model类型,多种验证规则”,本篇文章将为你提供相关的解决方案(源代码

MVC自定义AuthorizeAttribute实现权限管理

[转]MVC自定义AuthorizeAttribute实现权限管理 原文载自:小飞的DD http://www.cnblogs.com/feiDD/articles/2844447.html 网站的权限管理是一个很重要的功能,MVC中怎么实现对于网站的权限管理呢. 在MVC中有一个名为AuthorizeAttribute的类,我们可以创建我们自己的特性 MemberValidationAttribute类,然后继承AuthorizeAttribute类来实现我们自己的网站权限的管理.然后通过将

基于角色的权限设计(一)

在任何系统中,权限设计是最基础的东西,本文给出一个基于角色的权限设计的循序渐进的设计方案. 在权限系统中,功能(权限)是最小的单位,比如起草新闻.编辑新闻.审核新闻.删除新闻等,而角色是一类功能的集合,比如新闻编辑 这个角色,他可能有起草新闻.编辑新闻等功能集合,而责任编辑他可能就有更多的权限,比如除了新闻编辑的功能,还有审核新闻.删除新闻等功能,给张三赋予 新闻编辑的角色(其实我更愿意说把张三加入到新闻编辑这个角色中去),张三就可以起草新闻.编辑新闻了,给李四赋予责任编辑的角色,李四就可以起草