news 2026/9/11 15:31:25

Microsoft.AspNetCore.Authentication 核心库源码指南:构建与测试 ASP.NET Core 认证体系

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Microsoft.AspNetCore.Authentication 核心库源码指南:构建与测试 ASP.NET Core 认证体系

Microsoft.AspNetCore.Authentication 核心库源码指南:构建与测试 ASP.NET Core 认证体系

【免费下载链接】aspnetcoreASP.NET Core is a cross-platform .NET framework for building modern cloud-based web applications on Windows, Mac, or Linux.项目地址: https://gitcode.com/GitHub_Trending/as/aspnetcore

本指南围绕 ASP.NET Core 仓库中认证功能的共享实现——Microsoft.AspNetCore.Authentication核心库展开,介绍如何从源码构建、运行测试,并结合该目录下的核心抽象(认证方案、Handler、Builder、中间件、选项与事件机制)讲解其工作原理与源码级实现细节。读完本文,你将掌握该核心库的源码结构、开发环境搭建方法,并能依据源码理解 ASP.NET Core 认证管线的完整运行链路。

项目定位:认证功能的共享实现

Microsoft.AspNetCore.Authentication核心库位于仓库的 src/Security/Authentication/Core 目录下,是 ASP.NET Core 中所有认证相关组件的公共基座。整个 Security 区域在 Security 总 README 中被划分为:

  • Authentication/:识别用户的组件;
  • Authorization/:判断用户是否具备所需权限的组件;
  • CookiePolicy/:强制为响应 Cookie 施加安全属性的中间件;
  • perf/:性能测试基础设施;
  • samples/:组合上述功能区域的示例;
  • test/:共享测试。

当前核心库正是其中Authentication子区域的公共实现,后续的 Cookies、JwtBearer、OAuth、OpenIdConnect、Google、Facebook、WsFederation、Negotiate、Certificate 等具体认证方案(见 src/Security/Authentication 目录)都以它为基础派生。仓库明确指出,ASP.NET Security 不包含 Basic Authentication 中间件(因其存在安全隐患与性能问题),如在 IIS 下托管可通过 IIS 配置启用 Basic Authentication——这也是理解认证方案取舍的重要背景。

从该核心库的源码目录 Core/src 可以看到一组构成认证骨架的核心类型:AuthenticationHandlerAuthenticationBuilderAuthenticationMiddlewareAuthenticationSchemeOptionsRemoteAuthenticationHandlerRemoteAuthenticationOptions以及Events/目录下的一批上下文类(BaseContextResultContextRedirectContextRemoteFailureContext等)。

从源码构建核心库

该 README 指出,若要单独构建此项目,可遵循仓库根目录文档 docs/BuildFromSource.md 中"构建代码子集"一节的说明。最简化的方式是在security父目录下直接执行:

> ./build.cmd

这条命令会触发仓库既有的构建脚本(仓库根目录另有restore.cmdclean.cmd等配套脚本,以及 Unix 平台对应的restore.shclean.sh)。构建前需确保本机具备仓库 global.json 中声明的 .NET SDK 版本,并通过根目录 NuGet.config 完成依赖源配置。

运行测试

README 提供了两种测试方式:

  1. 按 docs/BuildFromSource.md 中"在命令行运行测试"一节的说明执行;
  2. 更简化的方式:在security父目录运行:
> ./build.cmd -t

-t参数用于执行测试。此外,也可以在项目src目录旁的tests目录中直接运行项目级测试:

> dotnet test

从仓库结构看,src/Security/test 保存着 Security 区域的共享测试,而各认证方案自身也带有对应的测试目录,例如 src/Security/Authentication/Cookies/test(若需单独验证 Cookie 方案可进入对应目录执行dotnet test)。

核心抽象源码剖析

AuthenticationHandler:认证处理的抽象基类

AuthenticationHandler<TOptions>是核心库的灵魂类型,定义于 AuthenticationHandler.cs,实现IAuthenticationHandler接口,要求TOptions继承自AuthenticationSchemeOptions。它向派生类型暴露了丰富的受保护成员:

  • SchemeOptionsContext:当前认证方案、选项实例与HttpContext
  • RequestResponse:当前请求与响应;
  • OriginalPath/OriginalPathBase:由IAuthenticationFeature提供的中间件视角下的原始路径(AuthenticationMiddleware会在管线入口处记录它们);
  • LoggerUrlEncoderTimeProvider:日志、URL 编码与时间服务(源码注释明确ISystemClock已过时,建议改用TimeProvider);
  • OptionsMonitor:用于感知运行期选项变更;
  • Events:事件对象,应用可在处理流程的关键节点获得控制权,默认实例为空操作;
  • ClaimsIssuer:签发 Claims 时使用的颁发者,取Options.ClaimsIssuer或回退到Scheme.Name

InitializeAsync是每次请求进入时的初始化入口,它从OptionsMonitor按方案名解析选项、设置TimeProvider,再依次调用InitializeEventsAsyncInitializeHandlerAsync。事件对象的分辨优先级为:Options.Events属性 →Options.EventsType从 DI 容器解析 →CreateEventsAsync创建默认实例。

AuthenticateAsync的处理流程值得注意:

  1. 先通过ResolveTarget(Options.ForwardAuthenticate)检查是否应转发到其他方案;
  2. 若无转发,则调用HandleAuthenticateOnceAsync——它通过_authenticateTask字段缓存结果,确保同一请求中HandleAuthenticateAsync只执行一次;HandleAuthenticateOnceSafeAsync则在此基础上捕获异常并转换为AuthenticateResult.Fail
  3. 最终通过LoggingExtensions输出方案是否成功认证的日志。

派生类必须实现的唯一抽象方法是HandleAuthenticateAsync;而HandleChallengeAsync(默认写 401)与HandleForbiddenAsync(默认写 403)为虚方法,认证方案可覆写以改变行为(如把 401 改写为跳转登录页的 302)。

AuthenticationBuilder 与 AddAuthentication 扩展

AuthenticationBuilder(见 AuthenticationBuilder.cs)封装了IServiceCollection,提供三个核心注册方法:

  • AddScheme<TOptions, THandler>:注册普通认证方案。底层AddSchemeHelper会执行:向AuthenticationOptions注册方案(记录HandlerTypeDisplayName)、用Services.Configure(authenticationScheme, ...)配置选项、注册带校验的命名选项(Validate中调用o.Validate(authenticationScheme))、以 Transient 生命周期注册 Handler,并追加PostConfigureAuthenticationSchemeOptions把 DI 中的TimeProvider注入选项;
  • AddRemoteScheme<TOptions, THandler>:注册基于RemoteAuthenticationHandler的远程认证方案,额外追加EnsureSignInScheme后置配置——它确保SignInScheme存在:options.SignInScheme ??= _authOptions.DefaultSignInScheme ?? _authOptions.DefaultScheme
  • AddPolicyScheme:注册PolicySchemeHandler,用于把认证操作重定向到其他方案。

对应的AddAuthentication扩展定义于 AuthenticationServiceCollectionExtensions.cs,提供三个重载:无参数版、defaultScheme版(等价于配置o.DefaultScheme = defaultScheme)与Action<AuthenticationOptions>配置版。无参数版除注册认证核心服务外,还注册了 Data Protection、Web Encoders、TimeProvider.SystemISystemClock(已过时但保留兼容)以及IAuthenticationConfigurationProvider

AuthenticationMiddleware:管线中的认证执行者

AuthenticationMiddleware(见 AuthenticationMiddleware.cs)的工作分三步:

  1. HttpContext.Features中设置IAuthenticationFeature,记录原始PathPathBase
  2. 遍历IAuthenticationSchemeProvider.GetRequestHandlerSchemesAsync()返回的方案,若某个 Handler 实现了IAuthenticationRequestHandlerHandleRequestAsync()返回true,则请求被该 Handler 接管并短路返回(这是远程认证回调路径得以处理的机制);
  3. 否则查找默认认证方案,执行context.AuthenticateAsync,成功时把result.Principal赋给context.User,并设置IHttpAuthenticationFeatureIAuthenticateResultFeature特性,随后await _next(context)继续管线。

选项体系:AuthenticationSchemeOptions 与远程认证扩展

AuthenticationSchemeOptions(见 AuthenticationSchemeOptions.cs)是所有认证方案选项的基类,核心属性包括:

  • ClaimsIssuer:生成 Claims 时的颁发者;
  • Events/EventsType:事件实例或其 DI 服务类型;
  • ForwardDefault/ForwardDefaultSelector:默认转发目标方案/按请求动态选择转发方案的委托;
  • ForwardAuthenticate/ForwardChallenge/ForwardForbid/ForwardSignIn/ForwardSignOut:分别控制五类认证操作的转发目标;
  • TimeProvider:测试用时间源。

其转发解析逻辑(ResolveTarget)优先级为:最具体的ForwardXxxForwardDefaultSelectorForwardDefault,首个非空结果即为转发目标;若目标等于当前方案名则视为禁用转发。这解释了为什么选项文档注释要求"将目标设为当前方案以禁用转发"。

RemoteAuthenticationOptions(见 RemoteAuthenticationOptions.cs)在基类之上补充了远程认证所需的配置:

  • CallbackPath:远程身份提供方回跳的请求路径(必填,缺失时Validate()抛出ArgumentException);
  • SignInScheme:认证成功后持久化用户身份的方案(通常对应 Cookie 方案),缺省回退到DefaultSignInScheme
  • BackchannelTimeout:与远程提供方通信的超时,默认 60 秒;
  • BackchannelHttpHandler/Backchannel:通信用的HttpMessageHandler/HttpClient
  • AccessDeniedPath/ReturnUrlParameter:用户拒绝授权时的跳转路径及回跳参数(默认"ReturnUrl");
  • RemoteAuthenticationTimeout:完成整个认证流程的时间上限,默认 15 分钟;
  • SaveTokens:是否把 access/refresh token 存入AuthenticationProperties,默认false以缩小认证 Cookie 体积;
  • CorrelationCookie:防伪关联 Cookie 的构建器,默认名称前缀.AspNetCore.Correlation.HttpOnly = trueSameSite = NoneSecurePolicy = AlwaysIsEssential = true
  • DataProtectionProvider:数据保护提供方。

Validate(string scheme)还额外校验:若SignInScheme与当前方案同名会抛出InvalidOperationException(远程方案不能自己充当登录持久化方案)。

远程认证:RemoteAuthenticationHandler 与关联 Cookie 防伪

RemoteAuthenticationHandler<TOptions>(见 RemoteAuthenticationHandler.cs)实现了IAuthenticationRequestHandler,专门处理"由外部托管的身份提供方完成认证"的场景。其关键机制:

  • ShouldHandleRequestAsync判断Options.CallbackPath == Request.Path,决定是否接管当前请求;
  • HandleRequestAsync在命中回调路径时调用RemoteAuthenticationAntiforgery.HandleWithoutAntiforgeryVerdictAsync包装的HandleRequestCoreAsync,其中调用HandleRemoteAuthenticateAsync解析票证;失败时构造RemoteFailureContext触发Events.RemoteFailure,并可能抛出AuthenticationFailureException
  • 关联 Cookie(CorrelationCookie)的默认属性(SameSite=NoneSecure)与常量CorrelationProperty = ".xsrf"CorrelationMarker = "N"AuthSchemeKey = ".AuthScheme"共同构成 OpenID Connect/OAuth 方案中防 CSRF 的基础设施。

数据序列化与 SecureDataFormat

核心库还提供了票证与属性的序列化基础设施:TicketSerializer.cs、TicketDataFormat.cs、PropertiesSerializer.cs、PropertiesDataFormat.cs 以及ISecureDataFormat<T>/IDataSerializer<T>接口。它们使得认证票证(AuthenticationTicket)可以被加密后写入 Cookie,Cookie 方案即依赖这一能力持久化登录状态。

更多信息

若需深入了解 Security 区域的整体结构,可查阅 Security README;要了解整个 ASP.NET Core 仓库的构建与贡献流程,可阅读根目录 README.md 与 CONTRIBUTING.md。需要说明的是,ASP.NET Core 的完整认证文档(如方案、Handler、转发与事件的高级用法)由官方文档站点提供,本仓库内则以源码与上述 README 为准。

【免费下载链接】aspnetcoreASP.NET Core is a cross-platform .NET framework for building modern cloud-based web applications on Windows, Mac, or Linux.项目地址: https://gitcode.com/GitHub_Trending/as/aspnetcore

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/11 15:30:47

RAG生产级调优:多路召回与Rerank协同提效实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/9/11 15:29:54

AI写专著高效之道:选对工具,轻松实现20万字专著的高质量撰写!

对于很多学者来说&#xff0c;写一本学术专著绝不是一时灵光一现&#xff0c;它更像是一场需要坚持多年的漫长战役。从挑选题目开始&#xff0c;到设计严密的章节结构&#xff0c;再到一点一点填充内容&#xff0c;核对文献&#xff0c;每个步骤都让人头疼。研究者们常常要利用…

作者头像 李华
网站建设 2026/9/11 15:23:59

ARM ML-KWS-for-MCU源码级静态评测:MCU语音唤醒与CMSIS-NN部署实战

最近在评估一批能在Cortex-M级别设备上跑的边缘AI方案&#xff0c;把ARM开源的ML-KWS-for-MCU整个拉下来做了一次源码级静态评测。这个项目在语音唤醒这个细分方向上是绕不开的参考实现&#xff1a;它用TensorFlow Lite Micro当推理引擎&#xff0c;用CMSIS-NN做内核加速&#…

作者头像 李华
网站建设 2026/9/11 15:23:48

西门子S120变频器历史报警记录深度解析与实战应用

1. S120变频器面板不是“黑盒子”&#xff0c;历史报警记录是可追溯的运维资产很多人第一次面对西门子S120变频器的BOP-2或IOP面板时&#xff0c;下意识觉得它只是个“启停调速”的简易操作屏——按几下按钮能跑起来就行&#xff0c;报警一亮就复位&#xff0c;历史记录&#x…

作者头像 李华
网站建设 2026/9/11 15:20:40

解决Windows虚拟机VT-x/EPT不支持问题的完整指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华