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

前言

上次,我们实现了《ASP.NET Core 自定义认证》:

services.AddAuthentication(option =>
{option.DefaultAuthenticateScheme = DemoAuthenticationOptions.Scheme;option.DefaultChallengeScheme = DemoAuthenticationOptions.Scheme;}).AddDemoAuthentication(options => { });

我们希望同时也能支持 JWT 认证,于是又加上了AddJwtBearer

services.AddAuthentication(option =>
{option.DefaultAuthenticateScheme = DemoAuthenticationOptions.Scheme;option.DefaultChallengeScheme = DemoAuthenticationOptions.Scheme;}).AddDemoAuthentication(options => { }).AddJwtBearer(options =>{...});

但是,我们发现 JWT 认证始终不起作用,只能使用自定义认证。

猜测可能是设置了DefaultAuthenticateScheme的原因,于是去掉了相关代码:

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

这次问题更大,直接报错了:

231a8a64ad4cf312c89ea811cbe6864c.png

查找原因

根据错误提示,我们找到了AuthenticationService的源码:

public virtual async Task ChallengeAsync(HttpContext context, string? scheme, AuthenticationProperties? properties)
{if (scheme == null){var defaultChallengeScheme = await Schemes.GetDefaultChallengeSchemeAsync();scheme = defaultChallengeScheme?.Name;if (scheme == null){throw new InvalidOperationException($"No authenticationScheme was specified, and there was no DefaultChallengeScheme found. The default schemes can be set using either AddAuthentication(string defaultScheme) or AddAuthentication(Action<AuthenticationOptions> configureOptions).");}}

如果没有传入scheme,则使用DefaultChallengeScheme

继续向上查找AuthorizationMiddlewareResultHandler的源码:

public async Task HandleAsync(RequestDelegate next, HttpContext context, AuthorizationPolicy policy, PolicyAuthorizationResult authorizeResult){if (authorizeResult.Challenged){if (policy.AuthenticationSchemes.Count > 0){foreach (var scheme in policy.AuthenticationSchemes){await context.ChallengeAsync(scheme);}}

scheme来自于policy.AuthenticationSchemes

继续向上查找AuthorizationMiddleware的源码:

var authorizeData = endpoint?.Metadata.GetOrderedMetadata<IAuthorizeData>() ?? Array.Empty<IAuthorizeData>();
var policy = await AuthorizationPolicy.CombineAsync(_policyProvider, authorizeData);

policy来自于IAuthorizeData的实现类。

那么,IAuthorizeData的实现类是谁呢:

public class AuthorizeAttribute : Attribute, IAuthorizeData

解决问题

现在,我们只需要在AuthorizeAttribute设置AuthenticationSchemes属性即可:

[HttpGet]
[Authorize(AuthenticationSchemes = "Bearer,Demo")]
public string  Get()
{...
}

BearerDemo分别是JwtBearerHandlerDemoAuthenticationHandler的默认 scheme。

结论

因为可以为不同方法设置AuthorizeAttribute,因此,完全可以设置特定路由只能接受指定的认证方式:

[HttpGet("OnlyForBearer")]
[Authorize(AuthenticationSchemes = "Bearer")]
public string OnlyForBearer()
{...
}[HttpGet("OnlyForDemo")]
[Authorize(AuthenticationSchemes = "Demo")]
public string OnlyForDemo()
{...
}

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

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

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

相关文章

Linux shell 编程(七):流程控制语句

流程控制语句 在shell中如果在终端输入多个命令&#xff0c;如果以&分隔则将命令放入后台执行&#xff0c;如果以;分隔&#xff0c;则表示一个命令集合。shell允许使用逻辑操作符&&和||来作为命令分隔符&#xff0c;他们分别时AND和OR. && 如果前面命令执行…

多线程锁--怎么理解Condition

在java.util.concurrent包中&#xff0c;有两个很特殊的工具类&#xff0c;Condition和ReentrantLock,使用过的人都知道&#xff0c;ReentrantLock&#xff08;重入锁&#xff09;是jdk的concurrent包提供的一种独占锁的实现。它继承自Dong Lea的 AbstractQueuedSynchronizer&a…

.NET 8 SDK安装包可以下载了

今早在一个技术交流群看到有.NET 8的安装交流&#xff0c;站长下载了&#xff0c;把安装过程记录了&#xff0c;总结是&#xff1a;目前还无法 正常使用 .NET 8 SDK&#xff0c;虽然可以正常下载、安装&#xff0c;但宇宙第一IDE VS还尚未支持&#xff0c;也许站长打开方式不对…

VUE3中实现word的预览功能

安装docx-preview cnpm i docx-preview --save 在vue文件中使用 <div ref"refWord" v-if"showType word" /> <script setup name"ResPreviewBox">import { ref } from vue import { httpGet, httpGetBlob } from ../utils/requ…

css定位positon

值描述absolute 生成绝对定位的元素&#xff0c;相对于 static 定位以外的第一个父元素进行定位。 元素的位置通过 "left", "top", "right" 以及 "bottom" 属性进行规定。 fixed 生成绝对定位的元素&#xff0c;相对于浏览器窗口进行定…

chrome插件网站

chrome插件网站 http://chromecj.com/

VUE3+pdfh5实现预览Pdf文件

安装插件 npm install pdfh5 使用 <template><el-container class"resPreview"><div ref"refPdf"/></el-container> </template><script setup name"PreviewBox">import { ref } from vue import { http…

TODO:从数据库中随机抽取一条记录

TODO&#xff1a;从数据库中随机抽取一条记录1.最直接&#xff0c;最粗暴的方法先计算记录的总数&#xff0c;然后选择一个从0到记录总数之间的随机数n&#xff0c;利用skip跳过n条记录&#xff0c;这是效率低下的的方法&#xff0c;首先的记录总数&#xff0c;在用skip会很耗时…

5gnr帧结构特点有哪些_PLC控制柜有哪些结构特点呢?

金陵奇峰PLC控制柜是指可编程控制柜&#xff0c;控制柜指成套的控制柜,可实现电机,开关的控制的电气柜。金陵奇峰PLC控制柜具有过载、短路、缺相保护等保护功能。下面奇峰小编来为大家介绍一下PLC控制柜有哪些特点。PLC控制柜特点与优势&#xff1a;1、PLC控制柜是指可编程控制…

基于 .NET 6 的轻量级 Webapi 框架 FastEndpoints

大家好&#xff0c;我是等天黑。FastEndpoints 是一个基于 .NET 6 开发的开源 webapi 框架&#xff0c;它可以很好地替代 .NET Minimal APIs 和 MVC &#xff0c;专门为开发效率而生&#xff0c;带来了全新的开发模式和编码体验。另外对于 .NET 的中间件、认证、授权、日志&…

OO学习总结(二)

第五次作业&#xff1a;多线程电梯 多线程的同步和控制 在本次作业里&#xff0c;请求发生器不断往请求队列里加入电梯请求&#xff0c;主调度器不停将电梯请求分发给从调度器&#xff0c;从调度器不断读取请求来操控电梯运行&#xff0c;因而这三者之间存在同步关系。请求发生…

js导出PPT -- pptxgen使用方法

pptxgen使用方法 下载地址 https://codechina.csdn.net/mirrors/gitbrent/PptxGenJS?utm_sourcecsdn_github_accelerator ## 1. 文件引入 <script src"../js/pptxgen.bundle.js"></script> <script src"../js/jszip.min.js"></scr…

记录最近的一些遇到的前端面试题

HTML部分&#xff1a;1.问&#xff1a;DOCTYPE是什么。 答&#xff1a;查看w3school的详细解释http://www.w3school.com.cn/ta...&#xff1a;DTD, SGML) 2.问&#xff1a;有哪些行内元素、有哪些块级元素。margin属性是否对行内元素有所作用。 答&#xff1a;块级元素常用的有…

【mysql】mysql优化

一&#xff0c;表设计   1.1. E-R&#xff08;entity relation&#xff09;实体关系图     长方形 实体 表     椭圆形 属性 字段     菱形 关系 一对一 多对一 属于 多对多   1.2. 三范式标准     原子性       个人信息       省市县乡镇  …

3d数学基础图形与游戏开发 英文版_1850款文字标题字幕条,AE图形预设包,logo生成神器...

2019最新1850款组文字LOGO动画预设&#xff0c;一键生成&#xff01;包含图形元素/字幕/logo/动画转场/背景等所有的元素都支持AE和PR所有元素的颜色、位置、大小、文字、Logo等都可以修改&#xff0c;包含GIF动图预览&#xff0c;方便查找使用&#xff0c;一键生成狂拽炫酷屌炸…

什么?WPF 不支持 SVG ?

什么&#xff1f;WPF 不支持 SVG &#xff1f;控件名&#xff1a;SharpVectors作者&#xff1a;Elinam LLC (Japan)项目地址&#xff1a; https://github.com/ElinamLLC/SharpVectors什么是SVG&#xff1f;SVG 指可伸缩矢量图形 (Scalable Vector Graphics)&#xff1b;SVG 用…

Vue实现pptx在线预览

PPTX在线预览&#xff0c;使用jquery的插件《PPTXjs》&#xff0c;纯前端实现pptx转html进行展示 1.在PPTXjs官网下载插件&#xff0c;并在index.html内引入 <link rel"stylesheet" href"/PPTXjs/css/pptxjs.css"> <link rel"stylesheet&quo…

手写数字识别

深度学习:一、感知器S型神经元sigmoid fuction:1/(1exp(-z)) ![image](https://yqfile.alicdn.com/2e0144aba1df89e4ad5437e51aa21abc052025e5.png)二、神经网路这是一个三层神经网络输入层 隐藏层 输出层三、手写数字识别神经网络一共四层神经网络&#xff0c;第一层是以28*28…

5.1 入门整合案例(SpringBoot+Spring-data-elasticsearch) ---- good

本节讲解SpringBoot与Spring-data-elasticsearch整合的入门案例。 一、环境搭建 新建maven项目&#xff0c;名字随意 pom.xml <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <…

小组是什么意思_生猪期货什么时候上市?相关企业如何参与生猪期货

2020年4月生猪期货已获中国证监会批准&#xff0c;7月份大连商品交易所开展生猪期货仿真交易&#xff0c;这个期待许久的新品种上市脚步声越来越近&#xff0c;而市场各方的关注度也日益提升。同时&#xff0c;期货公司也在积极备战&#xff0c;为需要申请交割库的实体企业提供…