我的第一個netcore2.2 api項目搭建(三)


 

上一章快速添加了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,到這,咱們已經完成了最簡單的驗證功能了,大家就可以自定義自己的驗證功能了。。。發揮你的想象力去干吧,這里就不多寫自定義驗證功能的東西了,大家按照自己的需求來就可以了。

其實到這里,通過咱們自己寫的這個中間件,咱們已經能夠猜到,常用的那些什么identity,OAuth2,jwt等等只是實現了netcore認證授權的接口而已,然后注入到項目,最后起到認證授權的作用!

下一章來簡單實現下用jwt實現認證授權的例子吧,未完,待續。。。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM