上一章快速添加了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);
}

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

我的第一个netcore2.2 api项目搭建(三)的更多相关文章

  1. 我的第一个netcore2.2 api项目搭建(三)续

    上一章快速陈述了自定义验证功能添加的过程,我的第一个netcore2.2 api项目搭建(三) 但是并没有真正的去实现,这一章将要实现验证功能的添加. 这一章实现目标三:jwt认证授权添加 在netc ...

  2. 我的第一个netcore2.2 api项目搭建(二)

    上一章快速使用SqlSugar搭建了netcore api项目,我的第一个netcore2.2 api项目搭建(一) 这一章实现目标二:api使用Swagger,实现api文档管理 效果图:第一张收缩 ...

  3. 我的第一个netcore2.2 api项目搭建(一)

    早早就想入门netcore,一直没下定决心,这次正好碰上项目服务变更,便想着入坑试试,边学边用. 目标: 一.api使用core版的SqlSugar,集成orm,实现快速开发 二.api使用Swagg ...

  4. 通过beego快速创建一个Restful风格API项目及API文档自动化

    通过beego快速创建一个Restful风格API项目及API文档自动化 本文演示如何快速(一分钟内,不写一行代码)的根据数据库及表创建一个Restful风格的API项目,及提供便于在线测试API的界 ...

  5. 通过beego快速创建一个Restful风格API项目及API文档自动化(转)

    通过beego快速创建一个Restful风格API项目及API文档自动化 本文演示如何快速(一分钟内,不写一行代码)的根据数据库及表创建一个Restful风格的API项目,及提供便于在线测试API的界 ...

  6. .Net Core 3.1浏览器后端服务(一) Web API项目搭建

    一.前言 基于CefSharp开发的浏览器项目已有一段时间,考虑到后期数据维护需要Server端来管理,故开启新篇章搭建浏览器后端服务.该项目前期以梳理服务端知识为主,后期将配合CefSharp浏览器 ...

  7. 简单创建一个SpringCloud2021.0.3项目(三)

    目录 1. 项目说明 1. 版本 2. 用到组件 3. 功能 2. 上俩篇教程 3. Gateway集成sentinel,网关层做熔断降级 1. 超时熔断降级 2. 异常熔断 3. 集成sentine ...

  8. vuejs学习——vue+vuex+vue-router项目搭建(三)

    前言 vuejs学习——vue+vuex+vue-router项目搭建(一) vuejs学习——vue+vuex+vue-router项目搭建(二) 为什么用vuex:组件之间的作用域独立,而组件之间 ...

  9. 跟我一起做一个vue的小项目(三)

    接下来我们进行轮播的开发 安装插件,选用2.6.7的稳定版本 npm install vue-awesome-swiper@2.6.7 --save 根据其github上面的用法,我们在全局引用,在m ...

随机推荐

  1. Maven编译过程中出现的问题

    在用Jenkins编译Gitlab上代码过程中,实际使用的是Maven服务器上的打包命令,以下为打包过程中出现的问题及解决方案 问题一:Maven无法编译Snapshot版本代码 答:登录至maven ...

  2. Linux下远程连接MySQL数据库

    估计搞了一个多小时才把这个远程连接搞好.一台本地电脑,一台云服务器,都是linux系统. 步骤 在服务器端开启远程访问 首先进入mysql数据库,然后输入下面两个命令: grant all privi ...

  3. Java多线程编程核心技术-第5章-定时器 Timer-读书笔记

    第 5 章 定时器 Timer 定时 / 计划功能在移动开发领域使用较多,比如 Android 技术.定时计划任务功能在 Java 中主要使用的就是 Timer 对象,他在内部使用多线程的方式进行处理 ...

  4. http协议 c++ 接收

    http消息格式:header+\r\n\r\n+ chunkLen + \r\n + chunkData + \r\n + chunkLen + \r\n + chunkData +\r\n + 0 ...

  5. 网站调试时记得关闭火狐adblock插件

    由于特殊需要,xmyanke需要在网站右侧添加一个弹窗,第一个网站加上代码后可以正常显示,第二个网站却怎么也看不到图片,同样的安装方法为什么差别那么大呢?重新复制代码还是不行,再试一遍,依然如此,wi ...

  6. 使用Git管理品优购项目 开始部分

  7. JQuery$.extend()用法

    1.合并多个对象. <span style="font-size:18px;">//用法: jQuery.extend(obj1,obj2,obj3,..) var C ...

  8. Scrapy笔记05- Item详解

    Scrapy笔记05- Item详解 Item是保存结构数据的地方,Scrapy可以将解析结果以字典形式返回,但是Python中字典缺少结构,在大型爬虫系统中很不方便. Item提供了类字典的API, ...

  9. 【LG2567】[SCOI2010]幸运数字

    [LG2567][SCOI2010]幸运数字 题面 洛谷 题目大意: 问你区间\([L,R](1\leq L\leq R\leq 10^{10})\)中有几个数是仅由\(6,8\)组成的数的倍数. 题 ...

  10. [SDOi2012]Longge的问题(洛谷 2303)

    题目描述 Longge的数学成绩非常好,并且他非常乐于挑战高难度的数学问题.现在问题来了:给定一个整数N,你需要求出∑gcd(i, N)(1<=i <=N). 输入格式 一个整数,为N. ...