• 我的第一个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实现认证授权的例子吧,未完,待续。。。

  • 相关阅读:
    JMS ActiveMQ研究文档
    HDD-FAT32 ZIP-FAT32
    C++中出现的计算机术语2
    提供一个免费的CSDN下载账号
    读完了csapp(中文名:深入理解计算机系统)
    IOS成长之路-Nsstring中搜索方法rangeOfString
    PHP汉字转拼音的两种方法+PHP提取汉字(中文)方法
    最小二乘法
    防止tab页重复的去请求服务端
    探索Android中的Parcel机制(上)
  • 原文地址:https://www.cnblogs.com/sy-ds/p/10833348.html
Copyright © 2020-2023  润新知