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));//加密身份資訊,儲存至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;
}
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中幾個操作就可以這樣簡單的完成了,關於代碼在文章下面會提供下載。
執行個體代碼
作者:LyIng.Net