.NetCore使用過濾器實(shí)現(xiàn)登錄權(quán)限認(rèn)證的方法小結(jié)
本文實(shí)例環(huán)境及版本.NetCore3.1
實(shí)現(xiàn)系統(tǒng)登錄驗(yàn)證方式個人總結(jié)如下:
1、自定義行為過濾器
2、自定義身份驗(yàn)證過濾器
3、新建BaseController在OnActionExecuting中實(shí)現(xiàn)
一、自定義行為過濾器在OnActionExecuting中實(shí)現(xiàn)
1、新建SystemAuthorizeFilter過濾器繼承自 IActionFilter
/// <summary> /// 自定義行為過濾器,實(shí)現(xiàn)登錄及權(quán)限的驗(yàn)證 /// </summary> public class SystemAuthorizeFilter : IActionFilter { public void OnActionExecuted(ActionExecutedContext context) { //throw new NotImplementedException(); } /// <summary> /// 在執(zhí)行控制器中的Action方法之前執(zhí)行該方法 判斷當(dāng)前用戶是否登錄 /// </summary> /// <param name="context"></param> public void OnActionExecuting(ActionExecutingContext context) { //排除可以匿名訪問的 未登錄時 if (HasAllow(context) == false && context.HttpContext.Session.GetString("User") == null) { bool isAjax = IsAjax(context.HttpContext.Request); //如果是Ajax請求自定義返回json if (isAjax) { context.Result = new JsonResult(new { Code = 401, Msg = "登錄已失效,請重新登錄2!" }) { StatusCode=StatusCodes.Status401Unauthorized }; } else { ContentResult Content = new ContentResult(); Content.Content = "<script type='text/javascript'>alert('登錄已失效,請重新登錄!'); top.location.href='/Login/Login';</script>"; Content.ContentType = "text/html;charset=utf-8"; context.Result = Content; } } } /// <summary> /// 排除掉控制器不需要鑒權(quán) 即加[AllowAnonymous]特性的無需鑒權(quán) /// </summary> /// <param name="context"></param> /// <returns></returns> public static bool HasAllow(ActionExecutingContext context) { var filters = context.Filters; if (filters.OfType<IAllowAnonymousFilter>().Any()) { return true; } var endpoint = context.HttpContext.GetEndpoint(); return endpoint?.Metadata?.GetMetadata<IAllowAnonymous>() != null; } /// <summary> /// 判斷是否是Ajax請求 /// </summary> /// <param name="req"></param> /// <returns></returns> public static bool IsAjax(HttpRequest req) { bool result = false; var xreq = req.Headers.ContainsKey("x-requested-with"); if (xreq) { result = req.Headers["x-requested-with"] == "XMLHttpRequest"; } return result; } }
2、在Startup的ConfigureServices中添加
//配置系統(tǒng)過濾器 services.AddControllersWithViews().AddMvcOptions(options => { //自定義行為過濾器的方式,驗(yàn)證是否登錄及用戶權(quán)限 options.Filters.Add<SystemAuthorizeFilter>(); }).AddNewtonsoftJson(options=> { //全局日期格式化 options.SerializerSettings.DateFormatString = "yyyy-MM-dd HH:mm:ss"; //返回的Json大小寫原樣輸出 options.SerializerSettings.ContractResolver = new DefaultContractResolver(); });
3、在登錄控制器如:LoginController.cs 或不需要鑒權(quán)的控制器或方法上添加[AllowAnonymous] 特性即可。
4、在頁面上Ajax請求中加入判斷如果返回的為401時給予提示并跳轉(zhuǎn)至登錄頁面
$.ajax({ type: "POST", data: "", async: false, dataType: "json", url: "", beforeSend: function () { }, success: function (data) { if (data.Code != null && data.Code != "undefined" && data.Code == 401) { alert('登錄已失效,請重新登錄!'); top.location.href='/Login/Login'; } console.log(data); }, complete: function () { }, error: function (data) { } });
二、自定義身份驗(yàn)證過濾器
新建CustomAuthorizeFilter過濾器繼承自 IAuthorizationFilter
/// <summary> /// 自定義身份驗(yàn)證過濾器,實(shí)現(xiàn)登錄及權(quán)限的驗(yàn)證 /// </summary> public class CustomAuthorizeFilter : IAuthorizationFilter { public void OnAuthorization(AuthorizationFilterContext context) { //如果需要授權(quán) 但未登錄 if (HasAllowAnonymous(context) == false && context.HttpContext.Session.GetString("User") == null) { bool isAjax = IsAjax(context.HttpContext.Request); //如果是Ajax請求自定義返回json if (isAjax) { context.Result = new JsonResult(new { Code = 401, Msg = "登錄已失效,請重新登錄2!" }) { StatusCode = StatusCodes.Status401Unauthorized }; } else { ContentResult Content = new ContentResult(); Content.Content = "<script type='text/javascript'> alert('登錄已失效,請重新登錄!'); top.location.href='/Login/Login'; </script>"; Content.ContentType = "text/html;charset=utf-8"; context.Result = Content; } } } /// <summary> /// 排除掉控制器不需要鑒權(quán)的 /// </summary> /// <param name="context"></param> /// <returns></returns> private static bool HasAllowAnonymous(AuthorizationFilterContext context) { var filters = context.Filters; if (filters.OfType<IAllowAnonymousFilter>().Any()) { return true; } var endpoint = context.HttpContext.GetEndpoint(); return endpoint?.Metadata?.GetMetadata<IAllowAnonymous>() != null; } /// <summary> /// 判斷是否是Ajax請求 /// </summary> /// <param name="req"></param> /// <returns></returns> public static bool IsAjax(HttpRequest req) { bool result = false; var xreq = req.Headers.ContainsKey("x-requested-with"); if (xreq) { result = req.Headers["x-requested-with"] == "XMLHttpRequest"; } return result; } }
使用方式同上,不需要鑒權(quán)的控制器或方法上添加[AllowAnonymous] 特性即可。
三、新建BaseController在OnActionExecuting中實(shí)現(xiàn)
在BaseController中重寫OnActionExecuting方法
/// <summary> /// 在執(zhí)行控制器中的Action方法之前執(zhí)行該方法 判斷當(dāng)前用戶是否登錄 /// </summary> /// <param name="context"></param> public override void OnActionExecuting(ActionExecutingContext context) { if (context.HttpContext.Session.GetString("User")==null) { //context.Result = Redirect("/Login/Login"); ContentResult Content = new ContentResult(); Content.Content= "<script type='text/javascript'>alert('登錄已失效,請重新登錄!');top.location.href='/Login/Login'</script>"; Content.ContentType = "text/html;charset=utf-8"; context.Result = Content; return; } }
其他的修改可參考上面兩種做補(bǔ)充,在需要鑒權(quán)的控制器上集成該BaseController即可。
到此這篇關(guān)于.NetCore使用過濾器實(shí)現(xiàn)登錄權(quán)限認(rèn)證幾種方式總結(jié)的文章就介紹到這了,更多相關(guān).NetCore登錄權(quán)限認(rèn)證內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
CreateOutputCachedItemKey 緩存key的創(chuàng)建
有關(guān)OutputCache的相關(guān)資料大家可以查看 OutputCacheProvider OutputCache的一點(diǎn)點(diǎn)認(rèn)識 ,我們還是復(fù)習(xí)一下OutputCache內(nèi)容2012-11-11ASP.NET性能優(yōu)化之讓瀏覽器緩存動態(tài)網(wǎng)頁的方法
上一篇《ASP.NET性能優(yōu)化之構(gòu)建自定義文件緩存》我們通過OutputCache,讓請求去訪問服務(wù)器asp.net的輸出緩存,我們擴(kuò)展了OutputCacheProvider,這相當(dāng)于是訪問服務(wù)器上的靜態(tài)資源。2011-09-09DataTable轉(zhuǎn)成字符串復(fù)制到txt文本的小例子
DataTable轉(zhuǎn)成字符串復(fù)制到txt文本的小例子,需要的朋友可以參考一下2013-03-03ASP.NET數(shù)據(jù)庫編程之處理文件訪問許可
ASP.NET數(shù)據(jù)庫編程之處理文件訪問許可...2006-09-09深入Lumisoft.NET組件與.NET API實(shí)現(xiàn)郵件發(fā)送功能的對比分析
本篇文章對Lumisoft.NET組件與.NET API實(shí)現(xiàn)郵件發(fā)送的功能兩者進(jìn)行了深入的對比分析。需要的朋友參考下2013-05-05Asp.NET 隨機(jī)碼生成基類(隨機(jī)字母,隨機(jī)數(shù)字,隨機(jī)字母+數(shù)字)
對于需要用asp.net 字母,隨機(jī)數(shù)字,隨機(jī)字母+數(shù)字生成隨機(jī)碼的朋友用的到2008-11-11