基于.NetCore3.1系列 ——认证授权方案之Swagger加锁

一、前言

在之前的使用Swagger做Api文档中,我们已经使用Swagger进行开发接口文档,以及更加方便的使用。这一转换,让更多的接口可以以通俗易懂的方式展现给开发人员。而在后续的内容中,为了对api资源的保护,我们引入了认证授权方案,利用HTTP提供了一套标准的身份验证框架,服务端可以用来针对客户端的请求发送质询(challenge),客户端根据质询提供应答身份验证凭证,进而实现对资源的保护。

因为之前在使用Swagger的系列中还没有加身份认证授权这一块,所以我们使用的接口都是没有进行资源保护的,而再后续又对认证授权这一块进行讲解又没有将Swagger好好的利用起来,使得每一次要测试授权认证的时候,都得使用postman在Hearer请求头中加入Authorization属性,导致每测试一个接口就得输入一次token令牌来实现认证,重复操作频繁,降低工作效率。

这个时候,我们刚好发现,Swagger已经帮我们是实现了一次输入令牌,不同接口多次调用,提高效率。这样,我们就可以将之前的Swagger系列和认证授权系列相结合。

说干就干。。。

二、回顾

Swagger系列:

基于.NetCore3.1系列 —— 使用Swagger做Api文档 (上篇)

基于.NetCore3.1系列 —— 使用Swagger做Api文档 (下篇)

基于.NetCore3.1系列 —— 使用Swagger导出文档 (番外篇)

基于.NetCore3.1系列 —— 使用Swagger导出文档 (补充篇)

JWT认证授权系列:

基于.NetCore3.1系列 —— 认证方案之初步认识JWT

基于.NetCore3.1系列 —— 认证授权方案之JwtBearer认证

基于.NetCore3.1系列 —— 认证授权方案之授权初识

基于.NetCore3.1系列 —— 认证授权方案之授权揭秘 (上篇)

基于.NetCore3.1系列 —— 认证授权方案之授权揭秘 (下篇)

三、开始

3.1. 添加Swagger

这里我们使用之前Swagger系列中的源码,可以发现这个在没有使用配置我们认证授权代码的情况下,资源api都是处于没有保护的情况下,任何人都可以调用使用,没有安全性。

public void ConfigureServices(IServiceCollection services)        {            services.AddSwaggerGen(c =>            {                c.SwaggerDoc("V1", new OpenApiInfo                {                    Version = "V1",   //版本                     Title = $"XUnit.Core 接口文档-NetCore3.1",  //标题                    Description = $"XUnit.Core Http API v1",    //描述                    Contact = new OpenApiContact { Name = "艾三元", Email = "", Url = new Uri("http://i3yuan.cnblogs.com") },                      License = new OpenApiLicense { Name = "艾三元许可证", Url = new Uri("http://i3yuan.cnblogs.com") }                });                var basePath = Path.GetDirectoryName(typeof(Program).Assembly.Location);//获取应用程序所在目录(绝对,不受工作目录影响,建议采用此方法获取路径)               //var basePath = AppContext.BaseDirectory;                var xmlPath = Path.Combine(basePath, "XUnit.Core.xml");//这个就是刚刚配置的xml文件名                c.IncludeXmlComments(xmlPath);//默认的第二个参数是false,对方法的注释                // c.IncludeXmlComments(xmlPath,true); //这个是controller的注释            });            services.AddControllers();        }

3.2. 添加认证授权

基于之前的认证授权方案系列,我们这一节的认证授权就使用之前使用的基于自定义策略授权的方式,实现授权。

3.2.1. 定义权限策略

定义一个权限策略PermissionRequirement,这个策略并包含一些属性。

public class PermissionRequirement: IAuthorizationRequirement{    public string _permissionName { get; }    public PermissionRequirement(string PermissionName)    {        _permissionName = PermissionName;    }}

3.2.2. 再定义一个策略处理类

public class PermissionRequirementHandler : AuthorizationHandler<PermissionRequirement>{    protected override Task HandleRequirementAsync(AuthorizationHandlerContext context, PermissionRequirement requirement)    {        var role = context.User.FindFirst(c => c.Type == ClaimTypes.Role);        if (role != null)        {            var roleValue = role.Value;            if (roleValue==requirement._permissionName)            {                context.Succeed(requirement);            }        }        return Task.CompletedTask;    }}

3.2.3. 下面展示了如何将自定义要求添加到策略

(请注意,由于这是自定义要求,因此没有扩展方法,而必须继续处理策略对象的整个 Requirements 集合):

public void ConfigureServices(IServiceCollection services)    {        services.AddControllers();        //基于自定义策略授权        services.AddAuthorization(options =>        {            options.AddPolicy("customizePermisson",              policy => policy                .Requirements                .Add(new PermissionRequirement("admin")));        });        //此外,还需要在 IAuthorizationHandler 类型的范围内向 DI 系统注册新的处理程序:        services.AddScoped<IAuthorizationHandler, PermissionRequirementHandler>();        // 如前所述,要求可包含多个处理程序。如果为授权层的同一要求向 DI 系统注册多个处理程序,有一个成功就足够了。    }

3.2.4. 应用自定义的策略的特性

指定当前用户必须是应用对控制器或控制器内的操作,如

[Authorize(Policy = "customizePermisson")]    public class MovieController : ControllerBase    {     }

3.3. 添加Swagger锁

利用Swagger为我们提供的接口,在AddSwaggerGen服务中,添加保护api资源的描述。

var openApiSecurity = new OpenApiSecurityScheme  {      Description = "JWT认证授权,使用直接在下框中输入Bearer {token}(注意两者之间是一个空格)\"",      Name = "Authorization",  //jwt 默认参数名称      In = ParameterLocation.Header,  //jwt默认存放Authorization信息的位置(请求头)      Type = SecuritySchemeType.ApiKey  };

添加请求头的Header中的token,传递到后台。

c.OperationFilter<SecurityRequirementsOperationFilter>();

开启加权锁

c.OperationFilter<AddResponseHeadersFilter>();c.OperationFilter<AppendAuthorizeToSummaryOperationFilter>();

代码整合如下:在ConfigureServices服务中

services.AddSwaggerGen(c =>        {            c.SwaggerDoc("V1", new OpenApiInfo            {                Version = "V1",   //版本                 Title = $"XUnit.Core 接口文档-NetCore3.1",  //标题                Description = $"XUnit.Core Http API v1",    //描述                Contact = new OpenApiContact { Name = "艾三元", Email = "", Url = new Uri("http://i3yuan.cnblogs.com") },                  License = new OpenApiLicense { Name = "艾三元许可证", Url = new Uri("http://i3yuan.cnblogs.com") }            });            var basePath = Path.GetDirectoryName(typeof(Program).Assembly.Location);//获取应用程序所在目录(绝对,不受工作目录影响,建议采用此方法获取路径)           //var basePath = AppContext.BaseDirectory;            var xmlPath = Path.Combine(basePath, "XUnit.Core.xml");//这个就是刚刚配置的xml文件名           // c.IncludeXmlComments(xmlPath);//默认的第二个参数是false,对方法的注释             c.IncludeXmlComments(xmlPath,true); // 这个是controller的注释            #region 加锁            var openApiSecurity = new OpenApiSecurityScheme            {                Description = "JWT认证授权,使用直接在下框中输入Bearer {token}(注意两者之间是一个空格)\"",                Name = "Authorization",  //jwt 默认参数名称                In = ParameterLocation.Header,  //jwt默认存放Authorization信息的位置(请求头)                Type = SecuritySchemeType.ApiKey            };            c.AddSecurityDefinition("oauth2", openApiSecurity);            c.OperationFilter<AddResponseHeadersFilter>();            c.OperationFilter<AppendAuthorizeToSummaryOperationFilter>();            c.OperationFilter<SecurityRequirementsOperationFilter>();            #endregion        });

c.AddSecurityDefinition("oauth2", openApiSecurity); 这里的方案名称必须是oauth2

四、运行

未加锁的情况下,效果如下:

上锁的程序后,执行后发现,

执行效果

五、总结

  1. 通过上面的汇总,我们已经实现将Swagger和net core身份认证授权才能访问接口

  2. 在以后测试接口授权的时候,就可以直接通过Swagger中的锁来调试运行,减少重复添加令牌进行操作。

(0)

相关推荐

  • 使用 Xunit.DependencyInjection 改造测试项目

    Intro 这篇文章拖了很长时间没写,之前也有介绍过 Xunit.DependencyInjection 这个项目,这个项目是由大师写的一个 Xunit 基于微软 GenericHost 和 依赖注入 ...

  • iNeuOS工业互联平台,.NETCore开发的视频服务组件iNeuVideo,RTSP转WebSocket

    目       录 1.      概述... 2 2.      将来集成到iNeuOS平台演示... 3 3.      iNeuVideo结构... 3 4.      iNeuVideo部署及 ...

  • Asp.Net Core Swagger 接口分组(支持接口一对多暴露)

    开始之前,先介绍下swagger常用方法. services.AddSwaggerGen    //添加swagger中间件 c.SwaggerDoc  //配置swagger文档,也就是右上角的下拉 ...

  • 让 gRPC 提供 REST 服务

    Intro gRPC 是一个高性能.开源和通用的 RPC 框架,面向移动和 HTTP/2 设计. gRPC 基于 HTTP/2 标准设计,带来诸如双向流.流控.头部压缩.单 TCP 连接上的多复用请求 ...

  • 基于.NetCore3.1系列 —— 使用Swagger做Api文档 (下篇)

    前言 回顾上一篇文章<使用Swagger做Api文档 >,文中介绍了在.net core 3.1中,利用Swagger轻量级框架,如何引入程序包,配置服务,注册中间件,一步一步的实现,最终 ...

  • .Net之Swagger基础使用

    今天 以下文章来源于鹏祥 ,作者AZRNG 鹏祥分享.Net相关技术文章,一起学习一起成长 介绍 Swagger 是一个规范和完整的框架,用于生成.描述.调用和可视化 RESTful 风格的 Web ...

  • .NET core 使用Swagger

    一 为什么使用swagger swagger是一种API文档管理的框架 1.可以在代码中添加注释,且自动生成API文档,无需再次编写,友好的界面让API文档更易懂. 2.一站式服务,只需要访问swag ...

  • C# 启动 Flask for Python

    概览 最近有个需求是通过c#代码来启动 python 脚本.嘿~嘿!!! 突发奇想~~既然可以启动 python 脚本,那也能启动 flask,于是开始着手操作. 先看gif图 准备 因为使用的是.N ...

  • NetCore 3.0 中使用Swagger生成Api说明文档及升级报错原因

    认识Swagger Swagger 是一个规范和完整的框架,用于生成.描述.调用和可视化 RESTful 风格的 Web 服务.总体目标是使客户端和文件系统作为服务器以同样的速度来更新.文件的方法,参 ...

  • 基于.NetCore3.1系列 —— 认证授权方案之授权揭秘 (上篇)

    一.前言 回顾:认证授权方案之授权初识 从上一节中,我们在对授权系统已经有了初步的认识和使用,可以发现,asp.net core为我们提供的授权策略是一个非常强大丰富且灵活的认证授权方案,能够满足大部 ...

  • 基于.NetCore3.1系列 —— 认证授权方案之授权揭秘 (下篇)

    一.前言 回顾:基于.NetCore3.1系列 -- 认证授权方案之授权揭秘 (上篇) 在上一篇中,主要讲解了授权在配置方面的源码,从添加授权配置开始,我们引入了需要的授权配置选项,而不同的授权要求构 ...

  • 基于.NetCore3.1系列 —— 使用Swagger做Api文档 (上篇)

    前言 为什么在开发中,接口文档越来越成为前后端开发人员沟通的枢纽呢? 随着业务的发张,项目越来越多,而对于支撑整个项目架构体系而言,我们对系统业务的水平拆分,垂直分层,让业务系统更加清晰,从而产生一系 ...

  • 基于.NetCore3.1系列 —— 日志记录之日志配置揭秘

    一.前言 在项目的开发维护阶段,有时候我们关注的问题不仅仅在于功能的实现,甚至需要关注系统发布上线后遇到的问题能否及时的查找并解决.所以我们需要有一个好的解决方案来及时的定位错误的根源并做出正确及时的 ...

  • 基于.NetCore3.1系列 —— 日志记录之自定义日志组件

    一.前言 回顾:日志记录之日志核心要素揭秘 在上一篇中,我们通过学习了解在.net core 中内置的日志记录中的几大核心要素,在日志工厂记录器(ILoggerFactory)中实现将日志记录提供器( ...

  • 基于.NetCore3.1系列 —— 日志记录之初识Serilog

    一.前言 对内置日志系统的整体实现进行了介绍之后,可以通过使用内置记录器来实现日志的输出路径.而在实际项目开发中,使用第三方日志框架(如: Log4Net.NLog.Loggr.Serilog.Sen ...

  • 东方联盟提出基于机器学习的蓝牙认证方案

    东方联盟研究人员提出了一种机器学习方法,该方法使用蓝牙网络中设备之间的真实交互作为可靠处理设备到设备身份验证的基础. 称为"交互真实性验证"(又名 VIA),重复身份验证方案旨在解 ...

  • CMP阻燃系列认证基础知识

    21 世纪,综合布线系统进入了一个以千兆传输速率为标志的八类铜缆时代.以万兆传输速率为标志的光缆时代,特别是5G的布局,千兆布线系统八类铜缆为代表的短线布线已经开始大量使用,然而很多的设计商.承建商. ...