Asp.net Mvc 身分識別驗證、異常處理、許可權驗證(攔截器)

來源:互聯網
上載者:User

本問主要介紹asp.net的身分識別驗證機制及asp.net MVC攔截器在項目中的運用。現在讓我們來類比一個簡單的流程:使用者登入》許可權驗證》異常處理。

1、使用者登入

驗證使用者是否登入成功步驟直接忽略,使用者登入成功後怎麼儲存目前使用者登入資訊(session,cookie),本文介紹的是身分識別驗證(其實就是基於cookie)的,下面看看代碼。

引入命名空間

using System.Web.Security;
Users ModelUser = new Users() { ID = 10000, Name = UserName, UserName = UserName, PassWord = PassWord, Roles = "admin" };//使用者實體string UserData = SerializeHelper.Instance.JsonSerialize<Users>(ModelUser);//序列化使用者實體//儲存身份資訊,參數說明可以看提示
FormsAuthenticationTicket Ticket = new FormsAuthenticationTicket(1, UserName, DateTime.Now, DateTime.Now.AddHours(12), false, UserData);HttpCookie Cookie = new HttpCookie(FormsAuthentication.FormsCookieName, FormsAuthentication.Encrypt(Ticket));//加密身份資訊,儲存至CookieResponse.Cookies.Add(Cookie);

現在身份資訊就儲存到cookie中了,如果有情境需要用到目前使用者的使用者ID或者別的資訊的時候該怎麼辦呢?

那麼,我們重新在cookie中擷取身份資訊,然後解密,再還原序列化成使用者實體就OK了。

        /// <summary>        /// 擷取使用者登入資訊        /// </summary>        /// <returns></returns>        public Users GetUser()        {            if (HttpContext.Current.Request.IsAuthenticated)//是否通過身分識別驗證            {                HttpCookie authCookie = HttpContext.Current.Request.Cookies[FormsAuthentication.FormsCookieName];//擷取cookie                FormsAuthenticationTicket Ticket = FormsAuthentication.Decrypt(authCookie.Value);//解密                return SerializeHelper.Instance.JsonDeserialize<Users>(Ticket.UserData);//還原序列化            }            return null;        }
2、許可權驗證

這裡用到的是MVC中的action攔截器(重寫OnActionExecuting),在action執行之前會先運行攔截器中的代碼。這裡同時可以身分識別驗證是否到期。

    /// <summary>    /// 許可權驗證    /// </summary>    public class AuthAttribute : ActionFilterAttribute    {        /// <summary>        /// 角色名稱        /// </summary>        public string Code { get; set; }        /// <summary>        /// 驗證許可權(action執行前會先執行這裡)        /// </summary>        /// <param name="filterContext"></param>        public override void OnActionExecuting(ActionExecutingContext filterContext)        {            //如果存在身份資訊            if (!HttpContext.Current.User.Identity.IsAuthenticated)            {                ContentResult Content = new ContentResult();                Content.Content = string.Format("<script type='text/javascript'>alert('請先登入!');window.location.href='{0}';</script>", FormsAuthentication.LoginUrl);                filterContext.Result = Content;            }            else            {                 string[] Role = CheckLogin.Instance.GetUser().Roles.Split(',');//擷取所有角色                if (!Role.Contains(Code))//驗證許可權                {                    //驗證不通過                    ContentResult Content = new ContentResult();                    Content.Content = "<script type='text/javascript'>alert('許可權驗證不通過!');history.go(-1);</script>";                    filterContext.Result = Content;                }            }        }    }

那麼在action中怎麼去調用呢?這裡貼出HomeController中的代碼來看下。

    public class HomeController : BaseController    {        [AuthAttribute(Code = "admin")]//驗證通過(這個action只允許admin查看)        public ActionResult Index()        {            Users ModelUser = CheckLogin.Instance.GetUser();            return View(ModelUser);        }        [AuthAttribute(Code = "user")]//驗證不通過        public ActionResult Index2()        {            return View();        }        [AuthAttribute(Code = "admin")]//驗證通過,發生異常        public ActionResult Index3()        {            return View();        }    }

這樣就可以把許可權控制到action了。

3、異常處理

上面HomeController並不是繼承Controller,而是繼承我們自己定義的一個BaseController,那麼我們來看看BaseController中有寫什麼東西?

    [ErrorAttribute]    public class BaseController : Controller    {        //所有Controller都繼承BaseController,則都會進行異常捕獲    }

在這裡BaseController只做了一件事情,就是增加了一個ErrorAttribute的錯誤攔截器,那麼只要是在Controller中發生的異常都會在ErrorAttribute中進行處理,你可以記錄到資料庫等操作。那麼我們看看ErrorAttribute是怎麼工作的。

    /// <summary>    /// 錯誤記錄檔(Controller發生異常時會執行這裡)    /// </summary>    public class ErrorAttribute : ActionFilterAttribute, IExceptionFilter    {        /// <summary>        /// 異常        /// </summary>        /// <param name="filterContext"></param>        public void OnException(ExceptionContext filterContext)        {            //擷取異常資訊,入庫儲存            Exception Error = filterContext.Exception;            string Message = Error.Message;//錯誤資訊            string Url = HttpContext.Current.Request.RawUrl;//錯誤發生地址            filterContext.ExceptionHandled = true;            filterContext.Result = new RedirectResult("/Error/Show/");//跳轉至錯誤提示頁面        }    }

在這裡可以把異常捕獲,然後跳轉到友好的錯誤提示頁面。在MVC中幾個操作就可以這樣簡單的完成了,關於代碼在文章下面會提供下載。

 

  執行個體代碼

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.