ASP.NET Core 同时支持多种认证方式 | Swagger 支持

前言

上次,我们实现了《ASP.NET Core 同时支持多种认证方式》:

services.AddAuthentication().AddDemoAuthentication(options => { }).AddJwtBearer(options =>{...});

我们还希望为 Swagger 也添加多种认证支持。

原来为支持 JWT 认证,Swagger 相关配置代码是这样的:

services.AddSwaggerGen(c =>
{c.SwaggerDoc("v1", new OpenApiInfo { Title = "WebApplication9", Version = "v1" });c.AddSecurityDefinition("bearerAuth", new OpenApiSecurityScheme(){Type = SecuritySchemeType.Http,Scheme = "bearer",});c.AddSecurityRequirement(new OpenApiSecurityRequirement {{new OpenApiSecurityScheme{Reference = new OpenApiReference{Type = ReferenceType.SecurityScheme,Id = "bearerAuth"}},new string[] { }}});
}

依葫芦画瓢,添加如下代码:

c.AddSecurityDefinition("demoAuth", new OpenApiSecurityScheme()
{Type = SecuritySchemeType.ApiKey,In = ParameterLocation.Query,Name = "_key",Scheme = "demo",
});
c.AddSecurityRequirement(new OpenApiSecurityRequirement {
{new OpenApiSecurityScheme{Reference = new OpenApiReference{Type = ReferenceType.SecurityScheme,Id = "demoAuth"}},new string[] { }
}
});

Swagger 可以正常显示 Authorize 页面:

2b768366d248a4b39219bfa7311f30af.png

但是,发现一个问题, 每次请求都会发送所有的认证信息,即使我们的方法只需要其中的一种:

ac9872b8028a092504f1f279794b6714.png

解决思路

这是因为,我们使用了AddSecurityRequirement增加了全局的安全要求。

应该根据方法上设置的AuthenticationSchemes添加对应的安全要求。

针对这一需求,可以使用 IOperationFilter 接口实现操作筛选器。检索 ApiDescription 以获取相关信息,例如方法级别的AuthorizeAttribute

实现

首先,创建SecuritySchemeOperationFilter继承自IOperationFilter,实现 Apply 方法:

internal class SecuritySchemeOperationFilter : IOperationFilter
{public void Apply(OpenApiOperation operation, OperationFilterContext context){if (context != null && operation != null){var authenticationSchemes = context.MethodInfo.GetCustomAttributes(true).OfType<AuthorizeAttribute>().SelectMany(attr => attr.AuthenticationSchemes.Split(',')).Distinct();string id = "";if (authenticationSchemes.Contains("Bearer")){id = "bearerAuth";}else if (authenticationSchemes.Contains("Demo")){id = "demoAuth";}operation.Security = new List<OpenApiSecurityRequirement>{new OpenApiSecurityRequirement {{new OpenApiSecurityScheme{Reference = new OpenApiReference{Type = ReferenceType.SecurityScheme,Id = id}},new string[] { }}}};}}
}

在上面的代码中,我们检查 API 上指定的授权过滤器,并在授权过滤器的基础上添加了适当的安全要求。

另外,修改一下 Swagger 注册代码:

services.AddSwaggerGen(c =>
{c.SwaggerDoc(...);c.AddSecurityDefinition("bearerAuth", ...);c.AddSecurityDefinition("demoAuth", ...);c.OperationFilter<SecuritySchemeOperationFilter>();
});

现在可以看到,对于OnlyForBearer API,只发送Bearer授权头,而不再发送Query查询字符串:

60c0eb02c7741252ce729e9a7d4ec5a1.png

结论

今天,我们通过 IOperationFilter 实现了 Swagger 同时支持多种认证方式。

添加微信号【MyIO666】,邀你加入技术交流群

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

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

相关文章

js监听url变化

//监听触发操作 function hashChangeFire(){alert("k") }//url变化监听器 if( (onhashchange in window) && ((typeof document.documentModeundefined) || document.documentMode8)) {// 浏览器支持onhashchange事件window.onhashchange hashChangeFire; …

Redis指南

一、简介 redis 和 memcached 都是高性能的键值缓存数据库服务&#xff0c;其中 memcached 支持多线程&#xff0c;而 redis 支持丰富的数据结构且能内置持久化机制。 redis 数据都是以键值形式存储的&#xff0c;键是字符串类型&#xff0c;值有 7 种类型&#xff08;本质上是…

SpringIOC之AbstractMessageSource

博主介绍&#xff1a;✌全网粉丝5W&#xff0c;全栈开发工程师&#xff0c;从事多年软件开发&#xff0c;在大厂呆过。持有软件中级、六级等证书。可提供微服务项目搭建与毕业项目实战&#xff0c;博主也曾写过优秀论文&#xff0c;查重率极低&#xff0c;在这方面有丰富的经验…

python3怎样交换数字顺序_python中怎么交换列的顺序

DataFrame的列有时我们需要对添加的列或原来的列进行交换顺序。data pd.DataFrame(np.arange(16).reshape(4,4),columnslist(abcd))In [88]: dataOut[88]:a b c d0 0 1 2 31 4 5 6 72 8 9 10 113 12 13 14 15一&#xff1a;获取DataFrame列标签cols list(data)In [94]: colsO…

【实战】手把手教你从 0 到 1 搭建一套 RocketMQ 集群

大家好&#xff0c;我是君哥。今天来分享怎样搭建 RocketMQ 集群。本文搭建集群使用的环境是 2 个云主机&#xff0c;架构如下&#xff1a;在 47.xx.xx.xx 和 39.xx.xx.xx 上分别部署一个 Name Server 和 Broker 主节点&#xff0c;这里不搭建从节点。也就是官网介绍的 2m-nosl…

使用SMART监控Ubuntu

参考&#xff1a;完全用 GNU/Linux 工作 - 29. 檢測硬碟 S.M.A.R.T. 健康狀態 1.安装 sudo apt-get install smartmontools2.查看硬盘的参数&#xff0c;需要获得Root权限 sudo smartctl -i /dev/sdasmartctl 6.5 2016-01-24 r4214 [x86_64-linux-4.4.0-122-generic] (local bu…

Shell中各种判断语法

Shell判断 按照文件类型进行判断 -b 判断文件是否存在&#xff0c;并且是否为快设备文件&#xff08;是块设备文件为真&#xff09; -c 判断文件是否存在&#xff0c;并且是否为字符设备文件&#xff08;是字符设备文件为真&#xff09; -d 判断文件是否存在&#xff0c;并且是…

敏捷制造:并不是你想像的矛盾体

\关键点\敏捷制造使企业能够比传统制造方式更快更有效地取悦客户 \敏捷方法实际上是为制造而不是软件而开发的 \敏捷制造需要从上到下的数字视角和承诺 \敏捷制造需要新的技能&#xff0c;还需要授权、扁平化合作和贯穿整个组织的沟通 \迈向敏捷制造的第一步可以是通过升级传统…

c#队列取值_在队列的开头获取对象– C#中的窥视操作

要在队列的开始处获取对象&#xff0c;代码如下-示例using System;using System.Collections.Generic;public class Demo {public static void Main() {Queue queue new Queue();queue.Enqueue("A");queue.Enqueue("B");queue.Enqueue("C");que…

上海一趟,我陷入了沉思

hi&#xff0c;这里是桑小榆。2022年8月20日&#xff0c;我去了一趟上海&#xff0c;交了很多新朋友&#xff0c;和各行业且具备独立思考的伙伴交流了很多&#xff0c;也吸收了很多的新东西。此篇我将分享我的感悟&#xff0c;并以自己的角度剖析存在的问题。痛苦与症状在此之前…

廖雪峰 练习 把用户输入的不规范的英文名字,变为首字母大写,其他小写的规范名字...

# -*- coding: utf-8 -*- #输入名字&#xff0c;变成首字母大写&#xff0c;其他字母小写的标准格式 def normalize(name):str1 for i, ch in enumerate(name):if i 0:str1 str1 ch.upper() #str.upper() 方法让字母转大写else:str1 str1 ch.lower() #str.lower()…

Swiper(Swiper master)是目前应用较广泛的移动端网页触摸内容滑动js插件

为什么80%的码农都做不了架构师&#xff1f;>>> Swiper(Swiper master)是目前应用较广泛的移动端网页触摸内容滑动js插件 http://www.swiper.com.cn/ 转载于:https://my.oschina.net/huqiji/blog/800482

vue实现todo功能(一):搭建vue-webpack环境

前言 我最开始因为项目原因接触的是react&#xff0c;对于我这种美观狂而言&#xff0c;react中难以调解的css让我十分抓狂&#xff0c;说是在写页面&#xff0c;因为不能写自己的样式&#xff0c;像是在拼凑页面&#xff0c;没意思。于是我开始了解vue这种将css html javacrip…

单模光电转换器怎么接_以太网光纤收发器怎么用?

以太网光纤收发器有单模、多模&#xff0c;单纤、双纤&#xff0c;百兆、千兆&#xff0c;电信级和工业级品质&#xff0c;稳定可靠&#xff0c;是网络高清监控优选设备。那么&#xff0c;以太网光纤收发器怎么用呢&#xff1f;接下来就由飞畅科技的小编来为大家详细介绍下以太…

Unity浅析

在分析PRISM项目的时候, 发现里面用到了Unity 这个Component, 主要用于依赖注入的。由于对其不熟悉&#xff0c;索性分析了一下&#xff0c;记载在此&#xff0c;以作备忘。 任何事物的出现&#xff0c;总有它独特的原因&#xff0c;Unity也是如此。 在Unity产生之前&#xff0…

WPF效果第一百九十六篇之彩色马蹄形图

上一篇又是基于ListBox改了改模板实现了点不一样的效果;今天来分享一点这些天一直摸索的好玩的效果;闲话不多扯直接看效果:1、对于各种定义就直接看下面:https://www.wigglepixel.nl/en/blog/what-are-color-spaces-color-profiles-and-gamma-correction2、关于马蹄图我找到了S…

grub4dos中的不容易理解的问题

2019独角兽企业重金招聘Python工程师标准>>> menu.lst中写有菜单&#xff0c;但又发现很多人使用BCD,是否是这样&#xff0c;通过menu.lst中的菜单引导的系统&#xff0c;是不通过BCD文件引导的&#xff0c;还是说它们是必须同时有的&#xff0c;并且要关联呢&#…

卸载wps后桌面上的office文件图标变成了白色

文章目录卸载wps后桌面上的office文件图标变成了白色第一步&#xff1a;第二步卸载wps后桌面上的office文件图标变成了白色 作者&#xff1a;wyf 第一步&#xff1a; **win(图标&#xff09;R&#xff0c;输入regedit&#xff0c;点击确定**第二步 2、找到HKEY_CLASSES_ROOT…

springboot单例模式注入对象_Spring 中经典的 9 种设计模式,打死也要记住啊!

本文转载自公众号“Java专栏1.简单工厂(非23种设计模式中的一种)2.工厂方法3.单例模式4.适配器模式5.装饰器模式6.代理模式7.观察者模式8.策略模式9.模版方法模式Spring中涉及的设计模式总结1.简单工厂(非23种设计模式中的一种)实现方式&#xff1a;BeanFactory。Spring中的Bea…

通过项目逐步深入了解Mybatis(四)

相关阅读&#xff1a; 1、通过项目逐步深入了解Mybatis<一> 2、通过项目逐步深入了解Mybatis<二> 3、通过项目逐步深入了解Mybatis<三> 本项目所有代码及文档都托管在 Github地址&#xff1a;https://github.com/zhisheng17/mybatis 延迟加载 什么是延迟加载…