.net core中的Authorization過濾器使用
前言
咱們上篇說到,過濾的簡(jiǎn)單介紹,但是未介紹如何使用,接下來幾篇,我來給大家講講如何使用,今天第一篇是Authorization。認(rèn)證過濾器,
開發(fā)環(huán)境介紹
開發(fā)工具:VS2019
開發(fā)環(huán)境:.net core 3.1
1.創(chuàng)建項(xiàng)目
首先創(chuàng)建一個(gè)Api的項(xiàng)目,選擇.net core的版本,選擇好,點(diǎn)擊創(chuàng)建即可
2 創(chuàng)建一個(gè)自定義類
public class AuthenticationTest: IAuthorizationFilter
{
public void OnAuthorization(AuthorizationFilterContext context)
{
//邏輯處理
}
}
查看IAuthorizationFilter源代碼

IAuthorizationFilter接口只有一個(gè)方法OnAuthorization,
創(chuàng)建一個(gè)類,繼承IAuthorizationFilter接口,然后實(shí)現(xiàn)一下接口方法。是不是有點(diǎn)疑問,AuthorizationFilterContext是什么?
3 AuthorizationFilterContext是什么?
中文理解:授權(quán)過濾器上下文
六大屬性:
- ActionDescriptor:獲取或設(shè)置所選動(dòng)作的ActionDescriptor。(獲取請(qǐng)求的Method)
- Filters:獲取所有適用的IFilterMetadata實(shí)現(xiàn)。(可以檢測(cè)請(qǐng)求的Action是否具備AllowAnonymous,如果有,則直接跳過AuthorizationFilter濾器)
- HttpContext:獲取或設(shè)置當(dāng)前請(qǐng)求的HttpContext。(獲取當(dāng)前請(qǐng)求的很多信息,例如當(dāng)前用戶信息,當(dāng)前請(qǐng)求的Heads[可以從Head獲取Token,即驗(yàn)證Token])
- ModelState:獲取模型狀態(tài)字典。在你使用MVC框架下,對(duì)Molde進(jìn)行驗(yàn)證的時(shí)候才會(huì)使用到,去驗(yàn)證模型是否驗(yàn)證通過。
- Result:獲取或設(shè)置請(qǐng)求的結(jié)果。將結(jié)果設(shè)置為null授權(quán)過濾器內(nèi)的非值將使過濾器管道的其余部分短路。
- RouteData:獲取或設(shè)置當(dāng)前請(qǐng)求的RouteData。(獲取當(dāng)前路由的信息)
4 編寫簡(jiǎn)答的業(yè)務(wù)邏輯
public class AuthenticationTest: IAuthorizationFilter
{
public void OnAuthorization(AuthorizationFilterContext context)
{
Console.WriteLine("我是Authorization過濾器");
//請(qǐng)求的地址
var url = context.HttpContext.Request.Path.Value;
#region 打印頭部信息
var heads = context.HttpContext.Request.Headers;
string msg = string.Empty;
foreach (var item in heads)
{
msg += item.Key + ":" + item.Value + "\r\n";
}
Console.WriteLine("我是heads:" + msg);
#endregion
}
}
5 注冊(cè)全局過濾器
找到Startup.cs文件,然后找到其中一個(gè)方法ConfigureServices,將代碼修改為這樣:
public void ConfigureServices(IServiceCollection services)
{
services.AddControllers();
//全局添加過濾器
#region 全局過濾器
services.AddMvc(a => {
a.Filters.Add<AuthenticationTest>();
});
#endregion
}
6.啟動(dòng)項(xiàng)目(這里是使用Kestrel作為服務(wù)器啟動(dòng),啟動(dòng)的是控制臺(tái)程序)

啟動(dòng)之后,會(huì)在控制臺(tái)打印如上圖所示,我們可以獲取當(dāng)前請(qǐng)求的Head信息。如果Head包含Token,我們也是可以獲取token,然后驗(yàn)證token,后面可以進(jìn)行一系列自己的邏輯運(yùn)算。
7.1擴(kuò)展IAsyncAuthorizationFilter
過濾器還存在一個(gè)異步過濾器,它是繼承IAsyncAuthorizationFilter
public class AsyncAuthentication : IAsyncAuthorizationFilter
{
public Task OnAuthorizationAsync(AuthorizationFilterContext context)
{
return Task.CompletedTask;
}
}
異步確認(rèn)請(qǐng)求授權(quán)的過濾器,和之前的IAuthorizationFilter區(qū)別,大家顯而易見,只是處理請(qǐng)求的方式不一樣,一個(gè)是同步,一個(gè)是異步,如果了解線程,就應(yīng)該了解二者的區(qū)別,在這只做簡(jiǎn)單介紹,編寫你自己業(yè)務(wù)邏輯,可以自由編寫。
7.2 擴(kuò)展:修改401返回的返回值 正常的401報(bào)錯(cuò):
public class AuthenticationTest: IAuthorizationFilter
{
public void OnAuthorization(AuthorizationFilterContext context)
{
context.Result = new StatusCodeResult(401);
}
}
效果如下圖:

這種并不是客戶想看到的,我們可以自定義返回值。
自定義的401報(bào)錯(cuò):
public class AuthenticationTest: IAuthorizationFilter
{
public void OnAuthorization(AuthorizationFilterContext context)
{
context.Result = new JsonResult(new { StatusCodeResult = StatusCodes.Status401Unauthorized, Title = "401", Time = DateTime.Now,test="測(cè)試" });
}
}
效果如下圖:

自定義設(shè)置返回的值,是沒有限制,可以根據(jù)場(chǎng)景進(jìn)行自定義,合適才是最好。
8.總結(jié):
通過上面的一頓操作,我們應(yīng)該能明白,一個(gè)自定義的權(quán)限過濾器的創(chuàng)建,注冊(cè),使用等。這個(gè)過濾器讓我們能控制用戶的請(qǐng)求,哪些是請(qǐng)求是當(dāng)前用戶可以匿名登錄,哪些請(qǐng)求是當(dāng)前用戶無權(quán)訪問的,在一方面,可以幫助我編寫自定義的權(quán)限管理,還是那句話,合適才是重要的!
到此這篇關(guān)于.net core中的Authorization過濾器使用的文章就介紹到這了,更多相關(guān).net core 過濾器內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
作者:喜歡吃魚的青年
出處:https://home.cnblogs.com/u/2828sea/
相關(guān)文章
發(fā)布asp.net core時(shí)如何修改ASPNETCORE_ENVIRONMENT環(huán)境變量
這篇文章主要介紹了發(fā)布asp.net core時(shí)如何修改ASPNETCORE_ENVIRONMENT環(huán)境變量,幫助大家更好的理解和學(xué)習(xí)使用.net技術(shù),感興趣的朋友可以了解下2021-04-04
asp.net結(jié)合Ajax驗(yàn)證用戶名是否存在的代碼
關(guān)于Ajax的操作簡(jiǎn)單總結(jié),結(jié)合Ajax驗(yàn)證用戶名是否存在的代碼2010-06-06
NLog路由規(guī)則和上下文信息知識(shí)點(diǎn)總結(jié)
在本篇文章里小編給各位整理的是關(guān)于NLog路由規(guī)則和上下文信息的相關(guān)文章,有需要的朋友們學(xué)習(xí)下。2019-10-10
將Excel中數(shù)據(jù)導(dǎo)入到Access數(shù)據(jù)庫(kù)中的方法
將Excel中數(shù)據(jù)導(dǎo)入到Access數(shù)據(jù)庫(kù)中的方法,需要的朋友可以參考一下2013-03-03
在Apache環(huán)境下成功的運(yùn)行ASP.NET的注意事項(xiàng)
在Apache環(huán)境下成功的運(yùn)行ASP.NET的注意事項(xiàng)...2007-08-08
ASP.NET?Core6.0-wwwroot文件夾無法訪問解決方法
ASP.NET?Core項(xiàng)目中的wwwroot文件夾被視為Web根文件夾,本文主要介紹了ASP.NET?Core6.0-wwwroot文件夾無法訪問解決方法,具有一定的參考價(jià)值,感興趣的可以了解一下2024-09-09
ASP.NET堆和棧四之對(duì)托管和非托管資源的垃圾回收和內(nèi)存分配
這篇文章介紹了.NET堆和棧中對(duì)托管和非托管資源的垃圾回收和內(nèi)存分配,文中通過示例代碼介紹的非常詳細(xì)。對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2022-08-08
ASP.NET 2.0中預(yù)設(shè)的cookie
ASP.NET 2.0中預(yù)設(shè)的cookie...2006-09-09

