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

1

开始

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

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

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

说干就干。。。

2

回顾

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

开始

3.1. 添加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

4

运行

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

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

执行效果

5

总结

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

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

  3. 搜索关注公众号【DotNet技术谷】--回复【加锁】,可获取本篇文章的源码。

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

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

相关文章

今晚8点,dotnet课堂全新起航,张善友/陈计节/刘腾飞我们一起来聊聊abp的故事...

直播主题&#xff1a;我们和Abp的故事直播嘉宾&#xff1a;张善友&#xff0c;陈计节&#xff0c;刘腾飞直播话题张善友&#xff1a;我是如何使用Abp的刘腾飞&#xff1a;利用Abp的模块化解决单体和分布式混合架构陈计节&#xff1a;Abp开源项目的DevOps实践Abp VNext 处于被低…

你知道技术委员会吗?嗯,一个既重要却又鸡肋的神秘组织

这是头哥侃码的第209篇原创前几天&#xff0c;在某群里有个有关 “技术委员会” 的话题讨论的挺火。很多时候&#xff0c;这种争论是不可能有结果的&#xff0c;因为每个人都会从自己的立场和三观出发&#xff0c;公说公有理&#xff0c;婆说婆有理&#xff0c;一般除了搞得唾沫…

[SpringBoot2]Lombok

引入依赖 <dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId></dependency>idea中搜索安装lombok插件 简化JavaBean开发 NoArgsConstructor //无参构造器 //全参构造器 //AllArgsConstructor Data ToStrin…

谷歌提议更改Istio指导委员会

导语谷歌认为&#xff0c;社区成员可以通过提交代码和非代码贡献的任何组合来对Istio项目产生影响。正文近日&#xff0c;谷歌针对Kubernetes环境的开源Istio服务网格项目的管理&#xff0c;提出了改变规则的理由&#xff0c;并提出了围绕贡献者席位和社区席位创建具有相同投票…

[SpringBoot2]yaml

简介 YAML 是 “YAML Ain’t Markup Language”&#xff08;YAML 不是一种标记语言&#xff09;的递归缩写。在开发的这种语言时&#xff0c;YAML 的意思其实是&#xff1a;“Yet Another Markup Language”&#xff08;仍是一种标记语言&#xff09;。 非常适合用来做以数据…

Golden Master Pattern :一种在.NET Core中重构遗留代码的利器

在软件开发领域中工作的任何人都将需要在旧代码中添加功能&#xff0c;这些功能可能是从先前的团队继承而来的&#xff0c;您需要对其进行紧急修复。可以在文献中找到许多遗留代码的定义&#xff0c;我更喜欢的定义是&#xff1a;“通过遗留代码&#xff0c;我们指的是我们害怕…

[SpringBoot2]web场景_静态资源规则与定制化

静态资源目录 只要静态资源放在类路径下&#xff1a; called /static (or /public or /resources or /META-INF/resources 访问 &#xff1a; 当前项目根路径/ 静态资源名 原理&#xff1a; 静态映射/**。 请求进来&#xff0c;先去找Controller看能不能处理。不能处理的所有请…

【Ids4实战】最全的 v4 版本升级指南

&#xff08;恰似一江春水向东流&#xff09;最近听说IdentityServer4从v3升级到v4了&#xff0c;其实很简单&#xff0c;就是nuget包升级一下的事儿&#xff0c;不过没想到涉及到的内容还挺多&#xff0c;要不然也不会直接从3.1直接蹦到4.0&#xff0c;这么大的跨度&#xff0…

你真的清楚DateTime in C#吗?

DateTime&#xff0c;就是一个世界的大融合。日期和时间&#xff0c;在我们开发中非常重要。DateTime在C#中&#xff0c;专门用来表达和处理日期和时间。本文算是多年使用DateTime的一个总结&#xff0c;包括DateTime对象的整体应用&#xff0c;以及如何处理不同的区域、时区、…

【翻译】.NET 5中的性能改进

在.NET Core之前的版本中&#xff0c;其实已经在博客中介绍了在该版本中发现的重大性能改进。 从.NET Core 2.0到.NET Core 2.1到.NET Core 3.0的每一篇文章&#xff0c;发现谈论越来越多的东西。然而有趣的是&#xff0c;每次都想知道下一次是否有足够的意义的改进以保证再发表…

[SpringSecurity]框架概述

概要 Spring 是非常流行和成功的 Java 应用开发框架&#xff0c;Spring Security 正是 Spring 家族中的 成员。Spring Security 基于 Spring 框架&#xff0c;提供了一套 Web 应用安全性的完整解决方 案。 正如你可能知道的关于安全方面的两个主要区域是“认证”和“授权”&a…

[译]使用DOT语言和GraphvizOnline来可视化你的ASP.NETCore3.0终结点01

这是系列文章中的第一篇&#xff1a;使用GraphvizOnline可视化ASP.NETCore3.0终结点。.第1部分-使用DOT语言来可视化你的ASP.NETCore3.0终结点(本文)第2部分-向ASP.NET Core应用程序添加终节点图第3部分-使用ImpromptuInterface创建一个自定义的DfaGraphWriter&#xff0c;以便…

.NET Core CLI 的性能诊断工具介绍

前言开发人员的.NET Core项目上线后&#xff0c;经常会出现各种问题&#xff0c;内存泄漏&#xff0c;CPU 100%&#xff0c;处理时间长等&#xff0c; 这个时候就需要快速并准确的发现问题&#xff0c;并解决问题&#xff0c; 除了项目本身的日志记录外&#xff0c;NET Core 为…

[SpringSecurity]HelloWorld入门案例

入门案例 第一步 创建springboot工程 第二步 引入相关依赖 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>org.springfram…

ASP.NET Core静态文件处理源码探究

前言静态文件&#xff08;如 HTML、CSS、图像和 JavaScript&#xff09;等是Web程序的重要组成部分。传统的ASP.NET项目一般都是部署在IIS上&#xff0c;IIS是一个功能非常强大的服务器平台&#xff0c;可以直接处理接收到的静态文件处理而不需要经过应用程序池处理&#xff0c…

[SpringSecurity]基本原理_过滤器链

SpringSecurity 本质是一个过滤器链&#xff1a; 从启动是可以获取到过滤器链&#xff1a; org.springframework.security.web.context.request.async.WebAsyncManagerIntegrationFil ter org.springframework.security.web.context.SecurityContextPersistenceFilter org.s…

通过Windows Visual Studio远程调试WSL2中的.NET Core Linux应用程序

最近两天在Linux中调试.NET Core应用程序&#xff0c;同时我发现在Linux中调试.NET Core应用程序并不容易。一直习惯在Visual Studio中进行编码和调试。现在我想的是可以简单快速的测试.NET Core应用在Linux。所以通过本篇文章我们能了解到如何在Windows中使用Visual Studio进行…

[SpringSecurity]基本原理_过滤器加载过程

过滤器如何进行加载的&#xff1f; 1.使用SpringSecurity配置过滤器 DelegatingFilterProxy 其中上面的getTargetBeanName()得到的名字是FilterChainProxy 找到FilterChainProxy这个类中的doFilter方法 最后两张图片里面的代码表示&#xff1a; 用了一个增强for循环和getFi…

[SpringSecurity]基本原理_两个重要的接口_UserDetailsService接口和PasswordEncoder接口

UserDetailsService接口 当什么也没有配置的时候&#xff0c;账号和密码是由 Spring Security 定义生成的。而在实际项目中 账号和密码都是从数据库中查询出来的。 所以我们要通过自定义逻辑控制认证逻辑。 如果需要自定义逻辑时&#xff0c;只需要实现 UserDetailsService 接…