【朝夕技术专刊】Core3.1WebApi_Filter-Authorize详解

欢迎大家阅读《朝夕Net社区技术专刊》第6期

我们致力于.NetCore的推广和落地,为更好的帮助大家学习,方便分享干货,特创此刊!很高兴你能成为忠实读者,文末福利不要错过哦!

前言:

本部分文档将详细给大家介绍CoreWebApi的Authorize鉴权授权;为什么要鉴权授权呢?如果没有启用身份认证,那么任何匿名用户只要知道了我们服务的url,就能随意访问我们的服务接口,从而访问或修改数据库。所以在各种系统开发中授权是必备的;今天这里就给大家说说授权的事儿。

01

PART

传统方式的授权

请看下图,在传统授权中,因为Http请求是没有状态的,http请求第一次请求和第二次请求是没有关系的,所有在传统的授权方式里面使用的是Session+Cookes;Session使用的较多;思路:客户端(浏览器)第一次请求服务器的时候,服务器针对于当前这个浏览器生成一个Session:Key-value形式,SessionId:Session值;客户端来登录获取权限的时候,服务器然后在响应请求的时候,把SessionId返回给客户端浏览器;浏览器把SessionId保存在cookies中,再次去请求服务器的时候带上这个SessionId的标识,然后服务器就可以识别到,这是上次某某某浏览器来访问过我,登陆过,这个SessionId是我服务器颁发的,就通过了权限认证了。

基于Session cookies的权限校验是比较传统的,也是最常见的,不过基于Session、Cookies的权限校验,存在一些尴尬事儿。

因为Session是存储在服务器的,在一些大型分布集群服务器中,Session共享的问题不太好解决(当然这里不是说不能解决),比方说有A/B/C/D四个服务器集群,那么登录时候如果是A服务器生成的Session,那么B服务器是不能用的;需要做Session共享,成本相对来说较高;

像大家在使用一些系统的时候,常常会见到一些像QQ、微信、淘宝账号 这类第三方账号登录,如果使用Cookies和Session来实现,成本很高;

02

PART

基于令牌的鉴权授权——Basic授权

在Asp.NetWebApi中可以使用Basic授权;Basic授权是基于令牌的,在登录的时候,服务器给颁发一个tiket(这里可以理解成一个钥匙),然后你去访问Api的时候,把这个tiket给带上,就可以通过校验;Basic认证实现起来非常简单;下面我把代码贴在这里供大家参考。

图1

注:就是在用户登录的时候通过在请求登录的时候传递的参数生成一个Tiket;使用PostMan调用如图2所示;

图2

那么有tiket了,在调用Api的时候,就需要验证这个tiket了,怎么验证呢?Richard老师这里是使用Asp.NetMVC中的Filter---AuthorizeAttribute来实现的。

图3

定义个Api:GetUserInfo.

在没有标记任何Filter的时候,通过Ajax请求Api;结果可以正常拿到,请看图4、图5


图4

图5

那标记特性以后呢?请看图6;图7


图6

图7

请求结果拿不到,因为在请求WebApi的时候没有把tiket带上。请看图8、图9、图10;

图8

图9


图10

现在可以正常调用Api获取到数据;那么Basic的流程如下:

1.    获取tiket;

2.    在调用Api的时候,把tiket带上;通过验证tiket的来达到授权的效果;

03

PART

基于令牌的鉴权授权——Jwt鉴权授权

Jwt鉴权:Json Web Token是在.NetCore中最主流的鉴权授权方式,这里Richard老师准备给大家详细解读Jwt鉴权授权的核心思路;请看图1

图1

图1为jwt鉴权授权的架构图,图1中分别有四个角色,客户端-User,鉴权中心AuthorziationServer,资源提供-Api,  第三方Api-Third-Party。

根据图中的流程:

  1.  请求鉴权中心AuthorziationServer(根据账号密码到鉴权中心登录),获取Token

  2. 去请求资源Api 或者第三方Api Third-Party 的时候带上token,就可以获取数据;

小伙伴儿在看到这个图以后,可能会觉得奇怪,资源Api并没有和鉴权中心AuthorizatinServer发生交互,是怎么验证权限的呢?这其实是Jwt鉴权的一大特点;

那是怎么鉴权的呢?下面就给大家解惑一下:

其实鉴权中心在生成Token,  Api在通过Token验证权限的时候,这二者或有一个非对称可逆加密解密的过程;

1.    鉴权中心兜儿里有一个私钥,用来加密;私钥是私密的,只有鉴权中心知道;

2.    资源Api或者第三方Api Thrid-Party兜儿里有一个和鉴权中的那个私钥对应的解密公钥,就是鉴权中心私钥加密,资源Api,公钥解密;公钥是公开的;谁都是知道的;

【这里涉及到有非对称加密解密的知识,如果对这一块的内容不是很理解的,可以联系QQ: 1432568536获取关于加密解密的内容】

 

那么鉴权中心和资源Api之间是怎么完成的呢?

  1.  在鉴权中心,登录以后,生成的Token是通过私钥加密的,这里就只有公钥能解开。

  2.  在请求Api的时候,资源Api有公钥,那么资源Api就去尝试解密,如果能解开,说明这个Token确实是来自于鉴权中心,那OK,那资源Api就通过校验,正常返回数据;否则就表示没有权限。

下面给大家介绍一下这个Token的内容结构:如图2,是一段标准的Token内容;一共分为三段。 

图2

第一段:头信息,红色部分,图3所示,表示加密算法:HS256,类型是jwt鉴权;

图3

第二段:图4所示:紫色部分,表示有效载荷,也就是在这个Token里面可以携带一些信息,有Token标准的信息内容,也可以自定义加一些内容。

图4

第三段:签名

签名Signature 

=HMACSHA256( base64UrlEncode(头信息) + "." +  base64UrlEncode(有效载荷信息),  公钥)

通过HMACSHA256 算法加密 +.+  Base64位的头信息+.+Base64位的有效载荷信息+.+公钥;三段内容通过点连接起来形成一个完整的Token 令牌。

那Token里的内容能修改吗?不能修改,如果修改过了,内容解密后,跟真实内容就不一样了;下面就基于Jwt在Core环境下做一个实现。

如果图1中所示,得有一个鉴权中心专门用来颁发Token;

图5

这里使用到了一个JwtService: 如图6jwtService 实现;

  1. 1.需要Nuget引入程序包:Microsoft.IdentityModel.Tokens

              Nuget引入程序包:System.IdentityModel.Tokens.Jwt

图6

  1. 2.需要在配置文件里配置:如图7所示

图7

【这部分的代码可以联系朝夕教育助教老师获取:QQ: 1432568536】如此鉴权中心就OK了;那Api部分呢?下面将继续说说Api如何基于Jwt授权。

1.    CoreWebApi需要在Startup 下的ConfigureServices中增加如下代码:

如图8所示


图8

2.在Startup中的Configure中指定使用授权;如图9所示;

图9

3.   在资源Api中标记特性;如图10所示。

图10

测试:

第一步:命令启动WebApi: dotnet Zhaoxi.Core.WebApi.dll --urls="http://*:8004" --                             ip="127.0.0.1" --port= 8004

如图11所示:

图11

第二步:PostMan 请求Api;图12所示,表示没有授权;所以需要授权,那怎么授权呢?需要启动鉴权中心,获取令牌Toke

图12

第三步:命令启动鉴权中心:dotnet Zhaoxi.Core.AuthenticationCenter.dll --urls="http://*:8001" --                         ip="127.0.0.1" --port= 8001

如图13所示

图13

第四步:PostMan请求获取Token;如图14所示:

图14

第五步:图14获取到了Toke, 就可以带上token 请求Api,正常获取数据,图15,图16所示。

图15

图16

以上就是整套的Jwt权限验证过程,使用的是Jwt鉴权授权。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/311148.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

以正确的方式下载和配置 ASP.NET Core 官方源码

我们可以在Github上面直接查看ASP.NETCore 3.x的源代码,但是我们也可以把源代码下载下来进行查看。而下载源代码进行查看有很多好处:任意的导航源代码内置了一个示例项目直接调试源代码下载源代码想下载并配置好源码,你需要:最新版…

h5应用 vue 钉钉_uniapp开发一个小视频应用(一)

“uni-app 是一个使用 Vue.js 开发所有前端应用的框架,是一种终极的跨平台解决方案,这里的平台,主要指的是App平台(android、ios)、小程序平台、H5平台。开发者编写一套代码,可发布到iOS、Android、H5、以及各种小程序(微信/支付宝…

Blazor入门

NOW现在行动!Blazor是一个基于C#, Razor和 HTML的新的Web UI框架。它通过WebAssembly运行在浏览器中。有利于使用C#而不是JavaScript构建交互式的Web UI。这篇文章演示了如何使用Blazor构建SPA应用。Blazor简化了可在任…

C#桌面开发的未来WebWindow

WebWindowWebWindow是跨平台的库。Web Window的当前实验实现可在以下平台上运行:Windows – 需要基于Chromium的EdgeLinux – 使用WebKitMac – 需要Safari源码https://github.com/SteveSandersonMS/WebWindow.gitZeje Fork的分支:https://github.com/ze…

C#小游戏—钢铁侠VS太空侵略者

身为漫威迷,最近又把《钢铁侠》和《复仇者联盟》系列又重温了一遍,真的是印证了那句话:“读书百遍,其意自现”。看电影一个道理,每看一遍,都有不懂的感受~ 不知道大伙是不是也有同样的感受,对于…

受检异常 非受检异常_这样设计 Java 异常更优雅,赶紧学

来源:Lrwinlrwinx.github.io/2016/04/28/如何优雅的设计java异常/导语异常处理是程序开发中必不可少操作之一,但如何正确优雅的对异常进行处理确是一门学问,笔者根据自己的开发经验来谈一谈我是如何对异常进行处理的。由于本文只作一些经验之…

.NET Core开发实战(第23课:静态文件中间件:前后端分离开发合并部署骚操作)--学习笔记(上)...

23 | 静态文件中间件:前后端分离开发合并部署骚操作我们先来看一下静态文件中间件有哪些能力1、支持指定相对路径2、支持目录的浏览3、支持设置默认文档4、支持多目录映射源码链接:https://github.com/witskeeper/geektime/tree/master/samples/StaticFi…

src获取同级目录中的图片_一个简单的Python爬虫实例:百度贴吧页面下载图片

本文主要实现一个简单的爬虫,目的是从一个百度贴吧页面下载图片。1. 概述本文主要实现一个简单的爬虫,目的是从一个百度贴吧页面下载图片。下载图片的步骤如下:获取网页html文本内容;分析html中图片的html标签特征,用正…

十问十答 Apache 许可证

Apache 许可证由 Apache Software Foundation(ASF)发行,是一个由强大社区支持的流行的被广泛部署的许可证。Apache 许可证允许你自由地使用、修改和分发任何 Apache 许可的产品,前提是遵循 Apache 许可的条款。01Apache 许可证的条…

(一)基于企业现金流预测的投资决策-项目介绍

项目背景 某企业想提高现金流的利用率,以便产生更大的投资收益。遇到的问题是:何如在保证更多的资金流向高收益投资的同时,不出现资金短缺的问题。 确定可用于投资的金额 Step1 预测未来的收入、支出和余额 潜在逻辑: 现金流 = 收入 - 支出当月余额(资金存量)= 上月余…

应用程序使用统计信息 – .NET CORE(C#) WPF界面设计

本文首发地址:https://dotnet9.com/10546.html关键功能点抽屉式菜单圆形进度条Demo演示:1. 新建项目使用 VS 2019 的 .NET Core 3.1 WPF 项目模板,创建名为 “MobileAppUsageDashboardCore” 的项目,NuGet 引入 MaterialDesign 的…

iso qemu 安装ubuntu_基于libvirt 和QEMU在macOS安装Ubuntu

在流行的虚拟架构体系中,最重要的技术当然要数libvirt和QEMU了。包括Linux虚拟化技术中KVM和xen都使用了QEMU。关于Xen和KVM进行虚拟化,以及在Window下使用Vmware,VirtualBox和hyper-v构建虚拟机,可能大家都有过很多的尝试。今天我…

在Ocelot中使用自定义的中间件(一)

Ocelot是ASP.NET Core下的API网关的一种实现,在微服务架构领域发挥了非常重要的作用。本文不会从整个微服务架构的角度来介绍Ocelot,而是介绍一下最近在学习过程中遇到的一个问题,以及如何使用中间件(Middleware)来解决…

多队列 部分队列没有包_记一次TCP全队列溢出问题排查过程

简介:记一次TCP全队列溢出问题排查过程1. 前言本文排查的问题是经典的TCP队列溢出问题,因TCP队列问题在操作系统层面没有明显的指标异常,容易被忽略,故把排查过程分享给大家。2. 问题描述A服务调用B服务接口超时,B服务…

[蓝桥杯2015决赛]完美正方形-dfs

题目描述 如果一些边长互不相同的正方形,可以恰好拼出一个更大的正方形,则称其为完美正方形。 历史上,人们花了很久才找到了若干完美正方形。 比如:如下边长的22个正方形 2 3 4 6 7 8 12 13 14 15 16 17 18 21 22 23 24 26 27 28 …

销量预测设计

目录一、算法计算逻辑举个直观的例子销量预测二、项目背景三、算法与业务的关系四、关于业务人员对未来外部变量“打标签”:五、关于预测颗粒度:六、关于预测准确率和影响准确率的因素:一、算法计算逻辑 销量预测算法建模要用到的数据&#…

.NET Core开发实战(第23课:静态文件中间件:前后端分离开发合并部署骚操作)--学习笔记(下)...

23 | 静态文件中间件:前后端分离开发合并部署骚操作这里还有一个比较特殊的用法一般情况下,我们前后端分离的架构,前端会编译成一个 index.html 文件和若干个 CSS 文件和 JavaScript 和图片文件CSS 文件和 JavaScript 和图片文件一般会部署在…

springboot 历史版本文档_乘风破浪,SpringBoot入门

SpringBoot入门篇前言在普通的java项目中,大量的xml文件配置起来相当繁琐,导致了开发效率非常低下,整合第三方框架的配置可能会存在冲突问题导致部署效率低,打包方式是将项目打成一个war包放入到tomactwebapps目录下执行。简单来说…

简洁直观解释精确率、召回率、F1 值、ROC、AUC

混淆矩阵 当我们在做二分类预测时,把预测情况与实际情况的所有结果两两混合,结果就会出现以下4种情况,就组成了混淆矩阵。 P(Positive):代表正样本N(Negative):代表负样…

基于Tensorflow搭建卷积神经网络CNN(水果识别)保姆及级教程

项目介绍 TensorFlow2.X 搭建卷积神经网络(CNN),实现水果识别。搭建的卷积神经网络是类似VGG的结构(卷积层与池化层反复堆叠,然后经过全连接层,最后用softmax映射为每个类别的概率,概率最大的即为识别结果…