本章主要讲解在MVC中灵活控制Action的访问权限;

本章所使用的示例表也是上一张所使用的TbUser、TbRole、TbUserRole;

最终的效果是针对任意一个Action或Controller,都可以根据配置的角色来控制访问权限;

完成此核心功能后,可以再往两方面扩展常用功能:

1. 可以根据 组织/用户/角色 的并集来控制权限

2. 以此核心功能为基础,实现菜单的动态配置

PS:扩展功能本章暂时不

  • 概述
  • 理论基础
  • 详细步骤
  • 总结

概述

一、MVC Form认证身份基础

通常用法举例:

1. web.config配置,开启form认证

MVC5+EF6 --自定义控制Action访问权限

2. 需要认证的 Control或Action 上添加过滤,例如限制只有用户"zhangsan"或者角色"管理员"可以访问

MVC5+EF6 --自定义控制Action访问权限     MVC5+EF6 --自定义控制Action访问权限

另外还有一种常用形式表示:只要有用户登录就可以访问

就是直接在Action或整个Controller上[Authorize]属性过滤

二、为什么需要自定义MVC权限过滤器

上述解决方式中很明显会发现有两个缺点:

1. 修改权限时需在Action, Controller上修改后需重新编译,不灵活。

2.过滤器中的Role是内置对象,如果不使用ASP.NET自身的集成权限方案,就无法按照角色来过滤。

解决这两个问题,只需要扩展类AuthorizeAttribute即可。

MVC5+EF6 --自定义控制Action访问权限

理论基础

为了能使用自定义的角色控制权限,我们需要扩展或绕过 ASP.NET 的Membership和Role provider 框架。

1.扩展:实现自定义的 Membership/Role provider

2.绕过:直接不使用

 

我们选择绕过的方式,这样的话更加灵活。

(因为如果你的角色结构和系统不一致,用扩展的方式弄起来比较麻烦)

我们使用form认证的三个核心API, 只用这几个API既可以减少工作量,又可以和Membership/Role provider保持独立。

1. FormsAuthentication.SetAuthCookie

用户登录后,指定用户名

2. Request.IsAuthenticated

登录后返回true

3. HttpContext.Current.User.Identity.Name

返回登录的用户名

 

权限过滤的完整过程:

1. Authetication ( 登录 )

登录成功后,调用 FormsAuthentication.SetAuthCookie 设置一个用户名。

2. Authorization(授权)

新建自定义的授权属性类:CustomAuthorizeAttribute(继承于AuthorizeAtrribute),扩展权限过滤器

3. 类似于默认Authorize attribute的使用方法,附加自定义的authorize attribute到controller或action上去,实现权限过滤

详细步骤

一、启用form认证,完成登录/退出 基本功能

1. 启用 form 认证

配置web.config,启用form认证

MVC5+EF6 --自定义控制Action访问权限

2. 完成登录/退出 基本功能

新建Controller: AccountController.cs

    public class AccountController : Controller
    {
        private MyDbContext db = new MyDbContext();
        // GET: Account
        public ActionResult Index()
        {
            return View();
        }

        public ActionResult Login()
        {
            ViewBag.LoginState = "登录前...";
            TempData["returnUrl"] = Request["ReturnUrl"];
            //如果当前有登录用户,就需要跳转到权限不足提示页面
            if (!string.IsNullOrEmpty(User.Identity.Name))
            {
                return View("NoPermissions");
            }
            else
            {
                return View();
            }
        }
        [HttpPost]
        public ActionResult Login(TbUser user)
        {
            string url = Convert.ToString(TempData["returnUrl"]);
            var userinfo = db.TbUsers.FirstOrDefault(u => u.Email == user.Email && u.Password == user.Password);
            if (userinfo != null)
            {
                FormsAuthentication.SetAuthCookie(userinfo.UserName, false);
                if (!string.IsNullOrEmpty(url))
                {
                    ViewBag.LoginState = userinfo.UserName + "登录后...";
                    return Redirect(url);
                }
                else
                {
                    return Redirect("~/");
                }

            }
            else
            {
                ViewBag.LoginState = user.Email + "用户不存在...";
            }
            return View();
        }

        public ActionResult Logout()
        {
            FormsAuthentication.SignOut();
            return Redirect(Request.UrlReferrer.ToString());
        }
        /// <summary>
        /// 权限不足页面
        /// </summary>
        /// <returns></returns>
        public ActionResult NoPermissions()
        {
            return View();
        }

    }
View Code

相关文章:

  • 2021-07-03
  • 2022-12-23
  • 2021-07-11
  • 2021-07-21
  • 2021-09-28
猜你喜欢
  • 2022-01-22
  • 2021-05-09
  • 2022-12-23
  • 2021-04-09
相关资源
相似解决方案