1. 程式人生 > >MVC 許可權控制 Authorize Roles 簡單實現

MVC 許可權控制 Authorize Roles 簡單實現

首先建立一個 BaseController ,讓所有的Controller繼承自BaseController 。

    [Authorize]
    public class BaseController : Controller
    {
    }

系統登入需要一個 AccountController ,繼承自BaseController ,並新增匿名訪問標記 AllowAnonymous。

AccountController 實現系統的登入功能,並將使用者資訊儲存到Cookie中。

    [AllowAnonymous]
    public class AccountController : BaseController
    {
        public ActionResult Index()
        {
            return View();
        }
        public ActionResult Login(string returnUrl)
        {
            ViewBag.ReturnUrl = returnUrl;
            return View();
        }
        [HttpPost]
        [AllowAnonymous]
        [ValidateAntiForgeryToken]
        public ActionResult Login(LoginModel model, string returnUrl)
        {
            string roles = "";
            var userName = model.UserName;
            if (userName == "admin")
            {
                roles = "Admin";
            }
            else if (userName == "ib")
            {
                roles = "IBusiness";
            }
            else if(userName == "ia")
            {
                roles = "IApproval";
            }
            FormsAuthenticationTicket authTicket = new FormsAuthenticationTicket(
            1,
            userName,
            DateTime.Now,
            DateTime.Now.AddMinutes(20),
            false,
            roles//寫入使用者角色
            );
            string encryptedTicket = FormsAuthentication.Encrypt(authTicket);
            System.Web.HttpCookie authCookie = new System.Web.HttpCookie(FormsAuthentication.FormsCookieName, encryptedTicket);
            System.Web.HttpContext.Current.Response.Cookies.Add(authCookie);
            return string.IsNullOrEmpty(returnUrl) ?
                RedirectToAction("Index", "Home")
                : RedirectToLocal(returnUrl);
        }
        private ActionResult RedirectToLocal(string returnUrl)
        {
            if (Url.IsLocalUrl(returnUrl))
            {
                return Redirect(returnUrl);
            }
            else
            {
                return RedirectToAction("Index", "Home");
            }
        }
        public ActionResult LogOff()
        {
            FormsAuthentication.SignOut();
            return RedirectToAction("Index", "Home");
        }
    }
}

在系統的業務Controller中新增角色驗證標記。

    [Authorize(Roles = "Admin,IBusiness,IApproval")]
    public class InfrastructureController : BaseController
    {
        public ActionResult Index()
        {
            return View();
        }
        [Authorize(Roles = "IBusiness")]
        public ActionResult Add()
        {
            return View();
        }
        [Authorize(Roles = "IApproval")]
        public ActionResult Approval()
        {
            return this.View();
        }
    }

 最後在Global.asax中新增驗證。

        /// <summary>
        /// 構造方法
        /// </summary>
        public MvcApplication()
        {
            AuthorizeRequest += new EventHandler(Application_AuthenticateRequest);
        }
        protected void Application_AuthenticateRequest(Object sender, EventArgs e)
        {
            HttpCookie authCookie = Context.Request.Cookies[FormsAuthentication.FormsCookieName];
            if (authCookie == null || authCookie.Value == "")
            {
                return;
            }
            FormsAuthenticationTicket authTicket = null;
            try
            {
                authTicket = FormsAuthentication.Decrypt(authCookie.Value);
            }
            catch
            {
                return;
            }
            string[] roles = authTicket.UserData.Split(new char[] { ',' });
            if (Context.User != null)
            {
                Context.User = new System.Security.Principal.GenericPrincipal(Context.User.Identity, roles);
            }
        }