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

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

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏逸鹏说道

微信扫码支付+Asp.Net MVC

这里的扫码支付指的是PC网站上面使用微信支付,也就是官方的模式二,网站是Asp.net MVC,整理如下。 一、准备工作 使用的微信API中的统一下单方法,关键...

68960
来自专栏林德熙的博客

win10 uwp 网络编程 带Header的WebRequest获取BufferHttpClient 使用 Cookie

上面传输的头,Head=Head+length 中的第二个Head,包含 传输者id,当前传输是传输的消息最后一段还是中间,当前传输 是服务器第消息

12810
来自专栏听雨堂

【6】页面数据和控件的自动交换机制

阅读目录 数据维护通用流程 数据的加载 数据的修改 数据的添加 自动交换机制 使用PageX来完成数据的自动加载 非标准数据的处理 只要...

24680
来自专栏蘑菇先生的技术笔记

日志系统实战(三)-分布式跟踪的Net实现

34360
来自专栏菩提树下的杨过

img标签的src=""会引起的Page_Load多次执行

今天看见园子里有人因img的src为空导致session丢失,详情见http://www.cnblogs.com/kyneblog/archive/2009/0...

228100
来自专栏晓晨的专栏

Entity Framework Core 2.0 使用代码进行自动迁移

16630
来自专栏GreenLeaves

WCF系列教程之消息交换模式之请求与答复模式(Request/Reply)

1、使用WCF请求与答复模式须知 (1)、客户端调用WCF服务端需要等待服务端的返回,即使返回类型是void (2)、相比Duplex来讲,这种模式强调的是客户...

234100
来自专栏JadePeng的技术博客

asp.net MVC 权限设计(续)

asp.net MVC 权限设计一文中没有demo放出来,应大家的要求,这里补充上文并放出demo。 几点说明:     1、基于将角色与controller、...

53760
来自专栏恰童鞋骚年

自己动手模拟开发一个简单的Web服务器

开篇:每当我们将开发好的ASP.NET网站部署到IIS服务器中,在浏览器正常浏览页面时,可曾想过Web服务器是怎么工作的,其原理是什么?“纸上得来终觉浅,绝知此...

26530
来自专栏菩提树下的杨过

.net中的认证(authentication)与授权(authorization)

注:这篇文章主要给新手看的,老手们可能会觉得没啥营养,就请绕过吧。 “认证”与“授权”是几乎所有系统中都会涉及的概念,通俗点讲: 认证(authenticat...

378100

扫码关注云+社区

领取腾讯云代金券