Asp.net Mvc 身份驗證、異常處理、權限驗證(攔截器)實現代碼

本問主要介紹asp.net的身份驗證機制及asp.net MVC攔截器在項目中的運用。如今讓咱們來模擬一個簡單的流程:用戶登陸》權限驗證》異常處理javascript

一、用戶登陸 
驗證用戶是否登陸成功步驟直接忽略,用戶登陸成功後怎麼保存當前用戶登陸信息(session,cookie),本文介紹的是身份驗證(其實就是基於cookie)的,下面看看代碼。 
引入命名空間 
using System.Web.Security; java

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));//加密身份信息,保存至Cookie 
Response.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; 
} 

二、權限驗證 
這裏用到的是MVC中的action攔截器(重寫OnActionExecuting),在action執行以前會先運行攔截器中的代碼。這裏同時能夠身份驗證是否過時。 cookie

/// <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中的代碼來看下。session

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了。 
三、異常處理 
上面HomeController並非繼承Controller,而是繼承咱們本身定義的一個BaseController,那麼咱們來看看BaseController中有寫什麼東西? asp.net

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

在這裏BaseController只作了一件事情,就是增長了一個ErrorAttribute的錯誤攔截器,那麼只要是在Controller中發生的異常都會在ErrorAttribute中進行處理,你能夠記錄到數據庫等操做。那麼咱們看看ErrorAttribute是怎麼工做的。 ide

/// <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中幾個操做就能夠這樣簡單的完成了,關於代碼在文章下面會提供下載。加密

實例下載spa

相關文章
相關標籤/搜索