上一章快速添加了swagger文檔管理功能,我的第一個netcore2.2 api項目搭建(二) 這一章實現目標二:api添加身份驗證功能 在實現該目標之前,先得理解netcore運行機制。 這是微軟提供的圖,從圖上可以看出,一個請求發出,逐個通過middleware,然後做出響應。這裡的middl ...
上一章快速添加了swagger文檔管理功能,我的第一個netcore2.2 api項目搭建(二)
這一章實現目標三:api添加身份驗證功能
在實現該目標之前,先得理解netcore運行機制。
這是微軟提供的圖,從圖上可以看出,一個請求發出,逐個通過middleware,然後做出響應。這裡的middleware被稱作中間件。而要添加安全驗證,得在響應之前添加驗證功能,那咱們就可以利用這點,添加一個在響應請求之前的中間件,這個中間件來實現驗證功能,如果通過驗證就響應請求,否則直接返回請求違法信息。在我看來這個中間級有點像mvc中過濾器。。
1.1添加一個空的中間件MyAutoMiddleware
public class MyAutoMiddleware { private readonly RequestDelegate _next; public MyAutoMiddleware(RequestDelegate next) { _next = next; } public Task Invoke(HttpContext httpContext) { return _next(httpContext); } }
1.2啟用中間件
在UserMvc之前添加中間件,併在中間件上打上斷點,F5運行
發現首先進入中間件,連按F5跳出,然後進入swagger主頁,在values控制器的GetUsers方法上打上斷點並執行swagger頁面GetUsers api
發現首先進入中間件,F5過後進入GetUsers方法
到這一步,就可以看出請求被中間件劫持了,這時咱們就可以名正言順的使用中間件進行驗證了,這裡可以先簡單的寫一些驗證。。
在繼續添加驗證之前,得先瞭解驗證過程
在netcore中有三種驗證方式,Policy,Roles、AuthenticationSchemes
咱們這先用Roles驗證,因為他最簡單好懂。。。繼續,驗證之前還得做啥呢?
1.角色,比如說你是系統管理員還是其中一個小角色等等
2.哪些api需要驗證
知道這些咱們就可以繼續驗證的過程了。
針對問題1,得有角色,咱們先簡單的就分為App1、App2、Admin好了,不用寫代碼。。。
針對問題2,只要在響應的控制器上加上驗證的Attribute就好了,如果該控制器有多個角色,只要改成Roles =“App1,Admin”就好了,用逗號隔開。
F5運行,更改網址到get,結果如下:
可以看出,無身份驗證方案,報錯了。。
在netcore中,身份信息是存在HttpContext的User對象中的:
如此,只要咱們在中間件給HttpContext的User賦值就好,代碼:
public Task Invoke(HttpContext httpContext) { var lc = new List<Claim>(); var claim = new Claim("姓名", "張三"); lc.Add(claim); claim = new Claim(ClaimTypes.Role, "App1"); lc.Add(claim); ClaimsIdentity identity = new ClaimsIdentity(lc); ClaimsPrincipal principal = new ClaimsPrincipal(identity); httpContext.User = principal; return _next(httpContext); }View Code
User這個對象的賦值有點複雜,是多個對象組成的。簡但說下:
Claim:感覺就是鍵值對,姓名啊,role啊。。
ClaimsIdentity:是多個Claim組成,有人說他是一種身份,感覺也蠻像的,多個屬性組成的對象不就是一種身份麽。。
ClaimsPrincipal:他有一個屬性Identities,是IEnumerable<ClaimsIdentity>,從這可以看出他是一個複雜的對象,有多種身份,像間諜似得,可能在多方都有許可權。
如果這些感覺差不多的話,就能理解User這個對象了,上面咱們給了他App1的許可權,試著F5運行訪問get方法:
通了,如果我把App1改成App2呢,試試:
不出所料,不行,從這可以看出,咱們在中間件中給出的許可權是App2的,而values控制器添加了App1的驗證,所以App2不能訪問App1,到這,咱們已經完成了最簡單的驗證功能了,後面咱們只要從這裡出發,補上各種現有的驗證插件就OK了,
其實到這裡,通過咱們自己寫的這個中間件,咱們已經能夠猜到,常用的那些什麼identity,OAuth2,jwt等等只是實現了netcore認證授權的介面而已,然後註入到項目,最後起到認證授權的作用!
接下來簡單實現下用jwt實現認證授權的例子吧,未完,待續。。。