佳木斯湛栽影视文化发展公司

主頁(yè) > 知識(shí)庫(kù) > Asp.net Mvc 身份驗(yàn)證、異常處理、權(quán)限驗(yàn)證(攔截器)實(shí)現(xiàn)代碼

Asp.net Mvc 身份驗(yàn)證、異常處理、權(quán)限驗(yàn)證(攔截器)實(shí)現(xiàn)代碼

熱門標(biāo)簽:Mysql連接數(shù)設(shè)置 Linux服務(wù)器 團(tuán)購(gòu)網(wǎng)站 科大訊飛語(yǔ)音識(shí)別系統(tǒng) 服務(wù)器配置 銀行業(yè)務(wù) 電子圍欄 阿里云
1、用戶登錄
驗(yàn)證用戶是否登錄成功步驟直接忽略,用戶登錄成功后怎么保存當(dāng)前用戶登錄信息(session,cookie),本文介紹的是身份驗(yàn)證(其實(shí)就是基于cookie)的,下面看看代碼。
引入命名空間
using System.Web.Security;
復(fù)制代碼 代碼如下:

Users ModelUser = new Users() { ID = 10000, Name = UserName, UserName = UserName, PassWord = PassWord, Roles = "admin" };//用戶實(shí)體
string UserData = SerializeHelper.Instance.JsonSerializeUsers>(ModelUser);//序列化用戶實(shí)體
//保存身份信息,參數(shù)說(shuō)明可以看提示
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);

現(xiàn)在身份信息就保存到cookie中了,如果有場(chǎng)景需要用到當(dāng)前用戶的用戶ID或者別的信息的時(shí)候該怎么辦呢?
那么,我們重新在cookie中獲取身份信息,然后解密,再反序列化成用戶實(shí)體就OK了。
復(fù)制代碼 代碼如下:

/// summary>
/// 獲取用戶登錄信息
/// /summary>
/// returns>/returns>
public Users GetUser()
{
if (HttpContext.Current.Request.IsAuthenticated)//是否通過(guò)身份驗(yàn)證
{
HttpCookie authCookie = HttpContext.Current.Request.Cookies[FormsAuthentication.FormsCookieName];//獲取cookie
FormsAuthenticationTicket Ticket = FormsAuthentication.Decrypt(authCookie.Value);//解密
return SerializeHelper.Instance.JsonDeserializeUsers>(Ticket.UserData);//反序列化
}
return null;
}

2、權(quán)限驗(yàn)證
這里用到的是MVC中的action攔截器(重寫OnActionExecuting),在action執(zhí)行之前會(huì)先運(yùn)行攔截器中的代碼。這里同時(shí)可以身份驗(yàn)證是否過(guò)期。
復(fù)制代碼 代碼如下:

/// summary>
/// 權(quán)限驗(yàn)證
/// /summary>
public class AuthAttribute : ActionFilterAttribute
{
/// summary>
/// 角色名稱
/// /summary>
public string Code { get; set; }
/// summary>
/// 驗(yàn)證權(quán)限(action執(zhí)行前會(huì)先執(zhí)行這里)
/// /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('請(qǐng)先登錄!');window.location.href='{0}';/script>", FormsAuthentication.LoginUrl);
filterContext.Result = Content;
}
else
{
string[] Role = CheckLogin.Instance.GetUser().Roles.Split(',');//獲取所有角色
if (!Role.Contains(Code))//驗(yàn)證權(quán)限
{
//驗(yàn)證不通過(guò)
ContentResult Content = new ContentResult();
Content.Content = "script type='text/javascript'>alert('權(quán)限驗(yàn)證不通過(guò)!');history.go(-1);/script>";
filterContext.Result = Content;
}
}
}
}

那么在action中怎么去調(diào)用呢?這里貼出HomeController中的代碼來(lái)看下。
復(fù)制代碼 代碼如下:

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

這樣就可以把權(quán)限控制到action了。
3、異常處理
上面HomeController并不是繼承Controller,而是繼承我們自己定義的一個(gè)BaseController,那么我們來(lái)看看BaseController中有寫什么東西?
復(fù)制代碼 代碼如下:

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

在這里BaseController只做了一件事情,就是增加了一個(gè)ErrorAttribute的錯(cuò)誤攔截器,那么只要是在Controller中發(fā)生的異常都會(huì)在ErrorAttribute中進(jìn)行處理,你可以記錄到數(shù)據(jù)庫(kù)等操作。那么我們看看ErrorAttribute是怎么工作的。
復(fù)制代碼 代碼如下:

/// summary>
/// 錯(cuò)誤日志(Controller發(fā)生異常時(shí)會(huì)執(zhí)行這里)
/// /summary>
public class ErrorAttribute : ActionFilterAttribute, IExceptionFilter
{
/// summary>
/// 異常
/// /summary>
/// param name="filterContext">/param>
public void OnException(ExceptionContext filterContext)
{
//獲取異常信息,入庫(kù)保存
Exception Error = filterContext.Exception;
string Message = Error.Message;//錯(cuò)誤信息
string Url = HttpContext.Current.Request.RawUrl;//錯(cuò)誤發(fā)生地址
filterContext.ExceptionHandled = true;
filterContext.Result = new RedirectResult("/Error/Show/");//跳轉(zhuǎn)至錯(cuò)誤提示頁(yè)面
}
}

在這里可以把異常捕獲,然后跳轉(zhuǎn)到友好的錯(cuò)誤提示頁(yè)面。在MVC中幾個(gè)操作就可以這樣簡(jiǎn)單的完成了,關(guān)于代碼在文章下面會(huì)提供下載。

實(shí)例代碼

作者:LyIng.Net
您可能感興趣的文章:
  • Asp.net Core 3.1基于AspectCore實(shí)現(xiàn)AOP實(shí)現(xiàn)事務(wù)、緩存攔截器功能
  • asp.net mvc core管道及攔截器的理解
  • ASP.NET Core 3.0 gRPC攔截器的使用
  • ASP.NET 通過(guò)攔截器記錄錯(cuò)誤日志的示例代碼

標(biāo)簽:棗莊 廣元 萍鄉(xiāng) 衡水 大理 江蘇 蚌埠 衢州

巨人網(wǎng)絡(luò)通訊聲明:本文標(biāo)題《Asp.net Mvc 身份驗(yàn)證、異常處理、權(quán)限驗(yàn)證(攔截器)實(shí)現(xiàn)代碼》,本文關(guān)鍵詞  ;如發(fā)現(xiàn)本文內(nèi)容存在版權(quán)問(wèn)題,煩請(qǐng)?zhí)峁┫嚓P(guān)信息告之我們,我們將及時(shí)溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡(luò),涉及言論、版權(quán)與本站無(wú)關(guān)。
  • 相關(guān)文章
  • 收縮
    • 微信客服
    • 微信二維碼
    • 電話咨詢

    • 400-1100-266
    巴马| 镇赉县| 开封县| 中江县| 姜堰市| 咸阳市| 平武县| 突泉县| 瑞丽市| 梁山县| 江陵县| 子洲县| 泗洪县| 汕尾市| 潞西市| 赞皇县| 乌拉特后旗| 景德镇市| 旬阳县| 华坪县| 岳阳县| 绿春县| 天台县| 大兴区| 哈巴河县| 黎平县| 洪泽县| 中宁县| 武夷山市| 南平市| 新巴尔虎右旗| 叶城县| 渑池县| 宁晋县| 桃源县| 和田市| 东乡| 同心县| 商洛市| 曲沃县| 永定县|