原来是IAuthenticationSchemeProvider类提供认证处理器.而且是通过反射实现(这点开销,就没必要考虑性能问题,当然你可以考虑重构),那么问题来了,在哪里出入IAuthenticationSchemeProvider服务内,回到上面那张图
微软也提供了默认实现,去看看GetSchemeAsync方法的实现
ok,到这里就说明认证处理器是通过向这个字典写入值,来实现的.
上面是认证方案AuthenticationScheme类的核心字段,HandlerType就是认证处理器.
AuthenticationSchemeProvider类维护了一个_schemes的字典,通过它向外输出.认证方案集合提供类.
接着认证处理器集合提供类AuthenticationHandlerProvider通过解析
认证方案集合提供类,拿到所有的认证处理器.
到这里,很明显,所有的认证处理器都是通过向AuthenticationSchemeProvider的_schemes字典注入认证处理器.既然如此,入口在哪?在AuthenticationBuilder类下面.
下面是Cookie认证方式注入认证处理器的方式
AddScmeme方法.在配置参数的同时,指定了处理器.
接着,回到中间件的图
我们通过AuthenticationBuilder的AddScheme方法向_schemes集合写入了认证处理器且配置了处理器的参数,接着通过AuthenticationHandlerProvider拿到了所有的认证处理器.
接着我们通过Schemes方案集合拿到所有处理认证请求上下文的处理器,执行处理认证请求上下文参数.处理完毕.
接着我们解析Schemes中提供的默认认证方案,代码如下:
根据
这个配置参数,一般在入口注入:
中配置默认方案名称,拿到默认认证方案.再将处理过的认证请求上下文和默认方案传给IAuthenticationService,这个Service也有默认实现,如下:
AuthenticationService将处理过的认证请求上下文交给具体的认证请求处理器来处理.并返回处理结果.认证请求处理器前面说过了,通过AuthenticationBuilder的AddScheme方法来注入.
到这里,整个组件的流程介绍结束.纯属个人理解,能力有限,有问题,请指正,谢谢.