皮皮网
皮皮网

【便签代源码】【kafka源码核心解读】【腾讯鉴黄源码】aspnetcore 源码

来源:vlc 源码输出 发表时间:2024-12-22 15:33:16

1.ASP.NET Core认证原理和实现
2.C# 有什么实用的源码第三方库吗?
3.从分析 SkyAPM-dotnet 源码学习现代 APM 探针设计理念(一)
4.asp.net core入门之Startup
5..netcore有哪些不错的开源项目?

aspnetcore 源码

ASP.NET Core认证原理和实现

       é€šå¸¸åœ¨åº”用程序中,安全分为前后两个步骤:验证和授权。验证负责检查当前请求者的身份,而授权则根据上一步得到的身份决定当前请求者是否能够访问期望的资源。

        既然安全从验证开始,我们也就从验证开始介绍安全。

        我们先从比较简单的场景开始考虑,例如在 Web API 开发中,需要验证请求方是否提供了安全令牌,安全令牌是否有效。如果无效,那么 API 端应该拒绝提供服务。在命名空间 Microsoft.AspNetCore.Authentication 下,定义关于验证的核心接口。对应的程序集是 Microsoft.AspNetCore.Authentication.Abstractions.dll。

        在 ASP.NET 下,验证中包含 3 个基本操作:

        验证操作负责基于当前请求的上下文,使用来自请求中的信息,例如请求头、Cookie 等等来构造用户标识。构建的结果是一个 AuthenticateResult 对象,它指示了验证是否成功,如果成功的话,用户标识将可以在验证票据中找到。

        常见的验证包括:

        在授权管理阶段,如果用户没有得到验证,但所期望访问的资源要求必须得到验证的时候,授权服务会发出质询。例如,当匿名用户访问受限资源的时候,或者当用户点击登录链接的时候。授权服务会通过质询来相应用户。

        例如

        质询操作应该让用户知道应该使用何种验证机制来访问请求的资源。

        在授权管理阶段,如果用户已经通过了验证,但是对于其访问的资源并没有得到许可,此时会使用拒绝操作。

        例如:

        拒绝访问处理应该让用户知道:

        在这个场景下,可以看到,验证需要提供的基本功能就包括了验证和验证失败后的拒绝服务两个操作。在 ASP.NET Core 中,验证被称为 Authenticate,拒绝被称为 Forbid。 在供消费者访问的网站上,如果我们希望在验证失败后,不是像 API 一样直接返回一个错误页面,而是将用户导航到登录页面,那么,就还需要增加一个操作,这个操作的本质是希望用户再次提供安全凭据,在 ASP.NET Core 中,这个操作被称为 Challenge。这 3 个操作结合在一起,就是验证最基本的要求,以接口形式表示,就是 IAuthenticationHandler 接口,如下所示:

        验证的结果是一个 AuthenticateResult 对象。值得注意的是,它还提供了一个静态方法 NoResult() 用来返回没有得到结果,静态方法 Fail() 生成一个表示验证异常的结果,而 Success() 成功则需要提供验证票据。

        通过验证之后,会返回一个包含了请求者票据的验证结果。

        在 GitHub 中查看 AuthenticateResult 源码

        那么验证的信息来自哪里呢?除了前面介绍的 3 个操作之外,还要求一个初始化的操作 Initialize,通过这个方法来提供当前请求的上下文信息。

        在 GitHub 中查看 IAuthenticationHandler 定义

        有的时候,我们还希望提供登出操作,增加登出操作的接口被称为 IAuthenticationSignOutHandler。

        在 GitHub 中查看 IAuthenticationSignOutHandler 源码

        在登出的基础上,如果还希望提供登录操作,那么就是 IAuthenticationSignInHandler 接口。

        在 GitHub 中查看 IAuthenticationSignInHandler 源码

        直接实现接口还是比较麻烦的,在命名空间 Microsoft.AspNetCore.Authentication 下,微软提供了抽象基类 AuthenticationHandler 以方便验证控制器的开发,其它控制器可以从该控制器派生,以取得其提供的服务。

        通过类的定义可以看到,它使用了泛型。每个控制器应该有一个对应该控制器的配置选项,通过泛型来指定验证处理器所使用的配置类型,在构造函数中,可以看到它被用于获取对应的配置选项对象。

        在 GitHub 中查看 AuthenticationHandler 源码

        通过 InitializeAsync(),验证处理器可以获得当前请求的上下文对象 HttpContext。

        最终,作为抽象类的 ,希望派生类来完成这个验证任务,抽象方法 HandleAuthenticateAsync() 提供了扩展点。

        验证的结果是一个 AuthenticateResult。

        而拒绝服务则简单的多,直接在这个抽象基类中提供了默认实现。直接返回 HTTP 。

        剩下的一个也一样,提供了默认实现。直接返回 HTTP 响应。

        对于 JWT 来说,并不涉及到登入和登出,所以它需要从实现 IAuthenticationHandler 接口的抽象基类 AuthenticationHandler 派生出来即可。从 AuthenticationHandler 派生出来的 JwtBearerHandler 实现基于自己的配置选项 JwtBearerOptions。所以该类定义就变得如下所示,而构造函数显然配合了抽象基类的要求。

        在 GitHub 中查看 JwtBearerHandler 源码

        真正的验证则在 HandleAuthenticateAsync() 中实现。下面的代码是不是就很熟悉了,从请求头中获取附带的 JWT 访问令牌,然后验证该令牌的有效性,核心代码如下所示。

        在 GitHub 中查看 JwtBearerHandler 源码

        在 ASP.NET Core 中,你可以使用各种验证处理器,并不仅仅只能使用一个,验证控制器需要一个名称,它被看作该验证模式 Schema 的名称。Jwt 验证模式的默认名称就是 "Bearer",通过字符串常量 JwtBearerDefaults.AuthenticationScheme 定义。

        在 GitHub 中查看 JwtBearerDefaults 源码

        最终通过 AuthenticationBuilder 的扩展方法 AddJwtBearer() 将 Jwt 验证控制器注册到依赖注入的容器中。

        在 GitHub 中查看 JwtBearerExtensions 扩展方法源码

        一种验证处理器,加上对应的验证配置选项,我们再为它起一个名字,组合起来就成为一种验证架构 Schema。在 ASP.NET Core 中,可以注册多种验证架构。例如,授权策略可以使用架构的名称来指定所使用的验证架构来使用特定的验证方式。在配置验证的时候,通常设置默认的验证架构。当没有指定验证架构的时候,就会使用默认架构进行处理。

        还可以

        注册的验证模式,最终变成 AuthenticationScheme,注册到依赖注入服务中。

        在 GitHub 中查看 AuthenticationScheme 源码

        各种验证架构被保存到一个 IAuthenticationSchemeProvider 中。

        在 GitHub 中查看 IAuthenticationSchemeProvider 源码

        最终的使用是通过 IAuthenticationHandlerProvider 来实现的,通过一个验证模式的字符串名称,可以取得所对应的验证控制器。

        在 GitHub 中查看 IAuthenticationHandlerProvider 源码

        它的默认实现是 AuthenticationHandlerProvider,源码并不复杂。

        在 GitHub 中查看 AuthenticationHandlerProvider 源码

        验证中间件的处理就没有那么复杂了。

        找到默认的验证模式,使用默认验证模式的名称取得对应的验证处理器,如果验证成功的话,把当前请求用户的主体放到当前请求上下文的 User 上。

        里面还有一段特别的代码,用来找出哪些验证处理器实现了 IAuthenticationHandlerProvider,并依次调用它们,看看是否需要提取终止请求处理过程。

        在 GitHub 中查看 AuthenticationMiddle 源码

C# 有什么实用的第三方库吗?

       推荐的.NET开源库:

       1. Masuit.Tools

       自家开源库,集成大量操作帮助函数,源码减少重复代码,源码支持数据库、源码日期时间、源码文件、源码便签代源码硬件、源码HTML操作等,源码%项目实现通过扩展方法完成,源码star数已超。源码

       2. Masuit.LunceneEFcore.SearchEngine

       基于EntityFrameworkCore和Lucene.NET实现的源码全文检索引擎,支持带权重查询,源码毫秒级响应。源码

       3. CacheManager

       用于简化缓存管理,源码支持多种缓存提供程序,源码实现多层缓存,易于维护。

       4. htmldiff.net-core

       用于比较和突出显示HTML文件差异的库。

       5. IP2Region

       高性能本地IP地理信息查询库,提供多种查询算法和语言绑定。

       6. MaxMind.GeoIp2

       全球范围IP地理信息查询库,支持城市级别地理信息查询。

       7. Karambolo.AspNetCore.Bundling.NUglify

       实现.NET Core中静态资源自动打包和压缩的库,支持js、css等。

       8. OpenXmlPowerTools

       提供使用Open XML文档编程的接口,支持文档拆分、合并等功能。

       9. svg

       用于生成和操作SVG图形文件的库。

       . TimeZoneConverter

       快速转换Windows标准时区与IANA/Rails之间的kafka源码核心解读库。

       . RssSyndication

       C#实现的RSS订阅接口库。

       . Z.EntityFramework.Plus.EFCore

       用于解决EF性能问题的三方库,提供过滤器、缓存等扩展功能。

       . SharpCompress

       文件压缩操作库,支持多种格式,提供只读和随机访问API。

       . DnsClient

       高性能DNS查询实现库。

       . AngleSharp

       解析HTML源码的DLL组件,支持DOM操作和JS语法。

       . HtmlSanitizer

       用于防止XSS攻击的HTML净化器。

       . ObjectsComparer

       对象比较器,自动逐个字段比较对象,生成差异结果。

       . SearchExtensions

       简单的本地全文检索中间件。

       推荐结束,如有更多好用的开源组件,欢迎分享。

从分析 SkyAPM-dotnet 源码学习现代 APM 探针设计理念(一)

       在后端软件行业的快速变迁中,从SOA到微服务、从业务一体化到中台战略、从虚拟化到云原生,技术更新速度日新月异。这种变革背后的核心动力在于硬件发展的瓶颈,促使行业转向追求软件的规模化效益。现代后端软件工程师面临的挑战之一是如何对服务性能有全面的理解,而APM(Application Performance Monitoring)工具成为了解决这一问题的关键。

       APM的基本构成包括指标性统计、分布式追踪和日志记录。腾讯鉴黄源码指标性统计,如服务的吞吐量、成功率、流量等,是对单个指标或数据库的分析。分布式追踪则关注一次请求的全过程,从客户端发起到服务完成,甚至涉及业务流程,如商品订购流程,追踪请求的流转轨迹。日志记录则是程序运行过程中产生的信息收集,提供实时的事件记录。

       随着技术的发展,性能监控工具的使用变得越来越普遍。早期,开发人员可能需要自己构建监控系统,但这既耗时又费力。SkyWalking等APM系统应运而生,旨在简化性能监控的实现,减少重复工作。

       在SkyWalking中,dotnet探针的设计遵循核心规范。dotnet探针主要基于DiagnosticSource实现,这提供了一种消息的生产者消费者模型,使得事件可以在任意地方被接收。微软官方库中,如HttpContext、HttpClient、SqlClient等,反外挂dll源码都预留了性能打点,以捕获关键事件。第三方库如gRPC、CAP、SmartSql也提供了同样的功能。

       开发人员可以通过适配SkyWalking,为自己的库添加性能打点,即向DiagnosticSource发送事件信息。这涉及到创建自定义采集器,监听特定事件,并将数据发送到数据中心。

       探针的核心代码在于监听消息,其关键在于DiagnosticListener,它实现了消息的监听与数据的上报。监听的事件由特定的Processor负责处理,这些Processor实现了ITracingDiagnosticProcessor接口,具体负责数据的收集与转换。

       两个有代表性的Processor示例展示了如何实现这一过程。一个针对AspNetCore请求管线,监听并收集请求相关的事件;另一个是针对System.Net下的通用 core入门之Startup

       ASP.NET Core入门之Startup解析

       Startup是ASP.NET Core应用程序的启动入口。在.NET 5及之前版本,通常通过startup.cs类进行程序初始化构造。而在.NET 5之后,操作简化,可以直接在Program类的主函数中构造配置Startup,或采用顶级语句方式直接编写。

       在startup配置中,`var app = builder.Build();`之前的代码负责应用初始化,包括依赖注入和配置加载等操作,linux编译源码程序对应于startup.cs中的`ConfigureServices`方法。随后的配置步骤则是中间件设置,对应于`Configure`方法。新版中,`UseRouting`和`UseEndpoints`用于注册路由中间件的调用不再显式,因为最小托管模型下终结点路由中间件已包装整个中间件管道,故无需再调用。`app.MapRazorPages();`相当于调用了`app.UseRouting();`和`app.UseEndpoints(endpoints => { endpoints.MapRazorPages(); });`。

       了解扩展Startup的方法,`IStartupFilter`接口用于扩展Startup功能。它允许在不显式注册默认中间件的情况下添加默认值到管道的开头,实现配置请求管道。每个`IStartupFilter`可以在管道中添加一个或多个中间件。筛选器按照添加顺序调用,可在中间件之前或之后添加,从而附加到应用管道的开头或末尾。

       通过实践,首先创建ASP.NET Core模板,包含Program文件。接下来添加`IStartupFilter`实现,用于控制台输出执行内容。在Program中注册`StartupFilterOne`,启动程序后可见中间件正常执行。多个`IStartupFilter`实现时,执行顺序与注入顺序相关。新增`StartupFilterTwo`并修改Program代码,发现是先执行`StartupFilterTwo`中的中间件,然后执行`StartupFilterOne`。

       中间件注册在管道头部或尾部,调整`StartupFilterTwo`代码将`next(builder)`放在前面执行,可观察到效果变化。在管道尾部执行中间件时,若为终结点中间件,后序中间件可能不会执行。

       讨论IStartupFilter的应用场景,适用于模块化开发方案、请求头部管道的校验或数据处理、请求管道尾部的特殊处理,如错误页面处理等。

       注意事项强调IStartupFilter只能注册在管道头部或尾部,确保中间件使用顺序正确。若需要在管道中间插入中间件,请使用正常的`app.use`配置。

       介绍IHostingStartup概念,可在启动时从外部程序集向应用添加增强功能,如实现代码0侵入的扩展服务。创建`StartupHostLib`类库,添加`Microsoft.AspNetCore.Hosting`包,新增实现`IHostingStartup`的类库。注意添加标记以识别`HostingStartup`,否则无法识别。在`LearnStartup`中引用项目,并在`launchSettings`环境变量中添加`ASPNETCORE_HOSTINGSTARTUPASSEMBLIES`配置。启动项目后发现`HostingStartup`执行顺序优先于应用,但会覆盖应用中间件管道,导致原有中间件消失。通过调整配置和依赖注入,可确保应用中间件正常工作。

       总结IHostingStartup的应用场景,适用于代码0侵入场景,如AOP数据收集,无需中间件的场景或符合`IStartupFilter`中间件的场景。详细理解可自行查阅源码,本文仅作简要介绍。

.netcore有哪些不错的开源项目?

       以下为推荐的几个.NET Core开源项目:

       1. Masuit.Tools

       这是一个包含了加密解密、反射操作、硬件信息、日期时间扩展等常用封装的开源项目。其开源协议规定,一旦因违反劳动法的公司使用该项目,项目作者有权追讨使用费或不允许使用包含该项目的源代码。项目特色功能包括Socket客户端操作类、模板引擎、任意进制转换、DateTime扩展及反射操作。

       2. OrchardCore

       OrchardCore 是使用 ASP.NET Core 构建的开源模块化、多租户应用程序框架,同时也是内容管理系统(CMS)的基础。它有两个项目,其中一个是 Fur,适用于.NET 5 平台的入门级、快速开发的 Web 应用框架。强调“六极”设计思想,易于入门、极速开发、极少依赖、极少配置、极其灵活、易于维护。此外,它结合了敏捷开发模式,用户能在冲一杯咖啡的时间内完成工作。Fur框架的特色功能包括支持.NET 5的新功能、六级架构设计和敏捷开发模式等。

       3. awesome-dotnet-core

       这个集合包含了.NET Core开源项目的库、工具、框架、模板引擎、身份认证、数据库、ORM框架、处理、文本处理、机器学习、日志、代码分析、教程等资源。

       4. ZKEACMS

       ZKEACMS 是一个基于ASP .Net Core开发的免费内容管理系统,提供了可视化编辑设计,支持直接在预览页面设计网页,以拼图方式构建网站。它采用跨平台设计,适用于Windows、MAC OS、Linux、Docker等环境。

       5. YiShaAdmin

       YiShaAdmin 是一个基于.NET Core Web开发的快速开发平台,提供了代码生成器,能够减少%以上的编码工作量,提高开发效率,节省项目研发成本和开发周期。它使用了Bootstrap、ASP.NET Core、Entity Framework Core等技术。

       6. .NET Core源码

       这是C#开源项目中的推荐,包含.NET Core源代码。

       7. Util应用框架

       Util是一个.NET Core平台下的应用框架,旨在提升小型团队的开发输出能力。它由常用公共操作类、分层架构基类、UI组件、第三方组件封装、第三方业务接口封装、代码生成模板、权限等功能组成。

       8. OSharp

       OSharp 是一个基于.NETStandard2.x的快速开发框架,使用了最新的.NETCore SDK,对 AspNetCore 进行了更高级的封装,并提供了一套规范的业务实现代码结构与操作流程,易于实际项目开发。

       9. XBlog

       这是个人博客系统,提供了技术要点和功能。

       . FreeSql

       FreeSql 是一个强大的对象关系映射技术(O/RM),支持.NETCore 2.1+或.NETFramework 4.0+或Xamarin等平台。

       . Autofac

       经典的依赖注入(DI)框架,适用于Microsoft .NET,管理类之间的依赖关系,使应用程序在大小和复杂性增长时易于更改。

       . OpenAuth.Core

       一个快速应用开发框架和权限管理工作流系统,基于经典领域驱动设计,提供组织机构、角色用户、权限授权、表单设计、工作流等功能。

       . Abp.VNext.Hello

       这是ABP框架的示例项目,具备分层和模块化结构,包含授权、验证、异常处理、日志、数据库连接管理、设置管理、审计日志等特性。

       以上项目涵盖了从基础工具到高级框架的多个类别,适合不同开发者需求。

相关栏目:探索