MVC 許可權控制 Authorize Roles 簡單實現
阿新 • • 發佈:2019-02-17
首先建立一個 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); } }