这难道不是.NET5的bug? 在线求锤?

hello,最近在对一个使用.NET5项目的认证授权系统进行重构,对.NET 5的授权中间件的源码有些看法。也希望同学们能帮我理解。

一个朴素的需求

这是一个api项目,默认所有的api都需要授权, 少量散落在Controller各处的api不需要授权访问,故这里有个全局授权访问+特例匿名访问的矛盾

以我粗鄙的想法,我相信.NET会很好的处理好这个矛盾:[AllowAnonymous]优先

这个想法在https://docs.microsoft.com/en-us/aspnet/core/security/authorization/simple?view=aspnetcore-5.0 得到印证


需求实现

在Startup ConfigureServices添加认证、授权服务

  //  认证服务services.AddAuthentication("token").AddScheme<TokenAuthenticationOptions, TokenAuthenticationHandler>(TokenAuthenticationDefaults.AuthenticationScheme,option => {option.ClaimsIssuer = configuration.GetSection("AppKeys")["ClaimsIssuer"].ToString();option.ClientId = configuration.GetSection("AppKeys")["ClientId"].ToString();option.ClientSign = configuration.GetSection("AppKeys")["ClientSign"].ToString();});// 授权服务
services.AddAuthorization(options =>{// 默认策略options.DefaultPolicy = new AuthorizationPolicyBuilder().RequireAuthenticatedUser().AddAuthenticationSchemes("token").Build();
});

既然现在.NET5推荐使用端点路由的形式,故针对我这个朴素的需求:

我理所当然会尝试使用在Controller端点上要求全局授权访问,对散落在各地的不需要授权的Controller添加[AllowAnonymous]特性。

 // 注册授权中间件app.UseAuthorization();app.UseEndpoints(endpoints =>{endpoints.MapHealthChecks("/healthz").AllowAnonymous().WithDisplayName("healthz");                  // 全局对所有api要求授权访问endpoints.MapControllers().RequireAuthorization().WithDisplayName("default");});
[AllowAnonymous]
[HttpGet]
[Route("triggerorder")]
public void TriggerOrder()
{...
}

实际测试发现,虽然我对Controller标记了允许匿名访问, 但请求始终进入了授权认证过程!这个朴素的授权需求竟然还遇到了障碍。

探究源码

授权中间件源码在此:https://github.com/dotnet/aspnetcore/blob/master/src/Security/Authorization/Policy/src/AuthorizationMiddleware.cs

源码很简单:

1. .NET 授权中间件先从端点获取了全局授权声明IAuthorizeData
2. 通过这个声明拿到了详细的全局授权策略
3. 后面直接开始走授权认证过程  ???    难以理解
4. 虽然后面又开始检测Controller-Action上面的AllowAnonymous特性,这时候已经晚了,你都把授权认证流程都走一遍了!!

很明显,基于端点的全局授权+零散的匿名访问特性 并没有贯彻[AllowAnonymous]特性优先的原则。

在这个测试例子中,当前端点的metadata确实包含AuthorizeAllowAnonymous两个特性!

后续

我在github上提了issue(https://github.com/dotnet/aspnetcore/issues/29377), 讲述了这个朴素的需求面临的障碍,但是官方的回答我并不满意:

> [the current behavior is intentional ]     [By Design]

暂时采用变通方案:我自行写了一个授权中间件(主体拷贝自官方), 自行将对[AllowAnonymous]特性的检测应用代码提到端点授权代码的前面, 这也是我内心认为的bug修复方案。

欢迎大家留言,提出意见或看法!

更多干货及最佳实践分享
关注并星标我们~。。~

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

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

相关文章

网管心得:优化网络性能给局域网提速[好文章]

网管心得:优化网络性能给局域网提速 目前&#xff0c;几乎任何稍微大一点的企业和学校都会建立一个局域网供使用&#xff0c;网络已经无处不在了。作为局域网络的网管人员&#xff0c;对于网络速度是非常在乎的&#xff0c;如何有效的利用带宽&#xff0c;避免不必要的速度损失…

win2008r2用户账户控制什么意思_养老保险统筹账户是什么意思?有什么用?

我国《社会保险法》规定&#xff1a;基本养老保险实行统筹账户和个人账户相结合的方式。对于在职职工来说&#xff0c;养老保险费分为单位缴费和个人缴费两部分&#xff1b;单位一般按照缴费基数的20%划入到统筹账户中&#xff0c;个人按照缴费基数的8%计入到个人账户里&#x…

android手机拍摄权限,react-native 手机拍照权限

第一步 &#xff1a;在 android/app/src/main/AndroidManifest.xml添加然后运行项目在手机应用权限哪里查看这是添加前的这是添加后的第二步调用import React, {Component} from react;import {View,Text,Image,StyleSheet,Button,Modal,TouchableHighlight,TouchableOpacity,D…

NHibernate for .NET 1.2

NHibernate for .NET 1.2 支持很多Hibernate 3.0的特性,性能方面据说有很大提高.下面这篇文章可以好好看看NHibernate Best Practices with ASP.NET, 1.2nd Ed.

Halcon和Opencv的区别?

1.MVTec HALCONMVTec HALCON 是世界上最全能的机器视觉软件.世界各地的用户从HALCON为快速开发图像分析和机器视觉程序的灵活架构获益匪浅.HALCON 提供了超过1100多种具备突出性能控制器的库,如模糊分析,形态,模式匹配,3D校正等.HALCON支持多个操作系统,编程语言和截获设备从而…

idea 一直在build_让web开发部署提速 8 倍的一款 IDEA 插件,你有在用?

原文:http://suo.im/4on4JE 来源于云栖社区>中间件小哥作为一个 Java 程序员&#xff0c;我们大多数会在 Intellij IDEA 中基于 SpringBoot 来开发 WEB 应用&#xff0c;所以本文中的测评将会基于以下几个架构来构建&#xff1a;开发环境&#xff1a;IDEA项目组织方式&…

Android 调用12306接口,GitHub - AndroidyxChen/loading-12306: 仿PC端12306的刷新loading的自定义view...

loading-12306仿PC端12306的刷新loading的自定义view效果图&#xff1a;核心代码及实现逻辑如下&#xff1a;mPaint.setColor(mColor);mPaint.setTextSize(50);//1、动画开启前&#xff0c;theCircle的初始值为-1&#xff0c;所以初始化时只走canvas.drawCircle()方法&#xff…

FreeBSD 下的 MySQL 备份方案

作/译者&#xff1a;叶金荣&#xff08;Email: &#xff09;&#xff0c;来源&#xff1a;http://imysql.cn&#xff0c;转载请注明作/译者和出处&#xff0c;并且不能用于商业用途&#xff0c;违者必究。核心提示&#xff1a;如何在 FreeBSD 下实现 MySQL 的全量及增量备份&am…

IdentityServer4(八)使用EntityFramework Core对数据进行持久化

上几篇&#xff0c;我们创建了客户端&#xff0c;scope&#xff0c;启动时&#xff0c;IdentityServer把这些配置数据加载至内存&#xff0c;但是&#xff0c;如果我们想要更改配置&#xff0c;就必须停掉IdentityServer&#xff0c;然后重新启动。且IdentityServe在r运行过程中…

centos 重启网卡_CentOS7网络配置和修改网卡名称及常用服务管理命令

1.设置IP地址和网关及DNSCentOS7里面的网卡名称不在是eth0,1,2而改成enoxxxxxx的格式&#xff0c;en代表的是enthernet以太网&#xff0c;o代表onboard内置&#xff0c;这种新的方式不但长&#xff0c;而且难记&#xff0c;不过优点也比较突出&#xff0c;有编号唯一性&#xf…

android平板 useragent,移动端适配 user-Agent

用navigator结合正则表达式来判断 打开网址的来源function getOrin() {if((navigator..match(/(phone|pad|pod|iPhone|iPod|ios|iPad|Android|Mobile|BlackBerry|IEMobuserAgentile|MQQBrowser|JUC|Fennec|wOSBrowser|BrowserNG|WebOS|Symbian|Windows Phone)/i))) {/*window.l…

推荐曹济的FPA培训课程

下面是课程的相关内容&#xff0c;供参考&#xff0c;如果有可能&#xff0c;也帮着推荐给别的同事&#xff0c;谢谢&#xff01; 软件功能点估算原理及实践课程说明&#xff1a;http://www.suiji.com.cn/FPA1.htm 功能点应用领域&#xff1a;http://www.suiji.com.cn/FPuse.ht…

C# 中的动态类型

翻译自 Camilo Reyes 2018年10月15日的文章 《Working with the Dynamic Type in C#》 [1] .NET 4 中引入了动态类型。动态对象使您可以处理诸如 JSON 文档之类的结构&#xff0c;这些结构的组成可能要到运行时才能知道。在本文中&#xff0c;Camilo Reyes 解释了如何使用动态…

python根据列表绘制柱状图_python把一个列表画柱状图

原博文 2018-10-18 14:28 − https://blog.csdn.net/w113691/article/details/80385534... 相关推荐 2019-12-07 19:38 − 用python画简单的树 代码如下&#xff1a; import turtle as T import random import time # 画樱花的躯干(60,t) def Tree(branch, t): time.sleep(0.00…

html 页面工具,html页面工具-htmlUnit

HtmlUnit测试工具的推出&#xff0c;创意非常好。是一款给java开发用的browser。说它是browser&#xff0c;其实它是对html建模并且提供API来访问页面&#xff0c;点击链接等等的java类库。这样的测试工具有这样几个优点&#xff1a;运行起来没有界面&#xff0c;速度非常快。由…

基于电子邮件的InfoPath表单发布的注意点 [Infopath 2007]

让我们先来看看InfoPath 2007提供的其他几种发布方案&#xff1a;1. 将InfoPath模板发布到SharePoint Server或者InfoPath Form Server2. 将InfoPath模板制作成一个安装程序3. 将InfoPath模板发布到一个共享网络地址上方案1,3 都必须依赖已有服务器或网络&#xff0c;而方案2 则…

如何在 C# 8 中使用 Index 和 Range

C# 8 中有几个比较好玩的新特性&#xff0c;比如下面的这两个&#xff1a;System.Index 和 System.Range&#xff0c;分别对应着索引和切片操作&#xff0c;这篇文章将会讨论这两个类的使用。System.Index 和 System.Range 结构体 可以用它们在运行时对集合进行 index 和 slice…

python 廖雪峰数据分析统计服_廖雪峰python教程阅读量统计

统计了下廖老师的python教程各个小节的阅读量&#xff08;毫无卵用&#xff09;&#xff0c;廖老师网站反爬做的比我们教务系统可是好多了&#xff0c;一定时间内访问次数多会禁止&#xff0c;反正数据量也不多&#xff0c;就慢慢来&#xff0c;基本上也不会对网站造成什么影响…

html点击图片弹出大图特效代码,Jquery 点击图片在弹出层显示大图

使用jquery&#xff0c;实现点击图片在弹出层显示大图&#xff0c;再次点击关闭&#xff0c;加入图片高宽和窗口高宽的大小判断。效果图片如下&#xff1a;1.点击前的效果&#xff1a;2.点击后的效果&#xff1a;html代码如下&#xff1a;弹出层图片Js代码如下&#xff1a;$(fu…

使用ClickOnce部署VS2005中的WinForm应用程序.(ZT)

使用ClickOnce部署VS2005中的WinForm应用程序/Files/chinhr/AA.rarTrackBack:http://blog.oracle.com.cn/155011/viewspace_3603.html