身份验证处理器就是用来定义这些步骤的
asp.net core中定义了对应的接口、和抽象类,不同的身份验证方式有不的实现类,比如基于token的身份验证方式在SignIn时直接加密票证然后返回这个字符串(而不是写入cookie)
这些步骤都是围绕身份验证来定义的,在不同地方来调用(比如在登录页对于的Action、在请求抵达时、在授权中间件中)
身份验证选项AuthenticationSchemeOptions
在上述身份验证处理的多个步骤中会用到一些选项数据,比如基于cookie的身份验证 cookeName、有效时长、再比如从请求时从cookie中解析得到用户标识后回调选项中的某个回调函数,允许我们的代码向调试中添加额外数据,或者干脆替换整个标识。
所以身份验证选项用来允许我们控制AuthenticationHandler的执行。不同的身份验证方式有不同的选项对象,它们直接或间接实现AuthenticationSchemeOptions
身份验证方案AuthenticationScheme
总结性的说:身份验证方案 = 名称 + 身份验证处理器类型,暂时可以理解一种身份验证方式 对应 一个身份验证方案,比如:
基于用户名密码+cookie的身份验证方式 对应的 身份验证方案为:new AuthenticationScheme("UIDPWDCookie",typeof(CookieAuthenticationHandler))
基于用户名密码+token 的身份验证方式 对应的 身份验证方案为:new AuthenticationScheme("JwtBearer",typeof(JwtBearerHandler))
身份验证方案在程序启动阶段配置,启动后形成一个身份验证方案列表。
程序运行阶段从这个列表中取出制定方案,得到对应的处理器类型,然后创建它,最后调用这个处理器做相应处理
比如登录操作的Action中xxx.SignIn("方案名") > 通过方案名找到方案从而得到对应的处理器类型 > 创建处理器 > 调用其SignIn方法
一种特殊的情况可能多种方案使用同一个身份验证处理器类型,这个后续的集成第三方登录来说
身份验证方案的容器AuthenticationSchemeProvider
我们说一个系统可能同时支持多种身份验证方案,因此我们需要一个容器,可以把它理解为Dictionary<方案名,身份验证方案>
身份验证处理器容器AuthenticationHandlerProvider
可以暂时把它理解为Dictionary<方案名, 身份验证处理器容器>,因为这个对象是每次请求都会创建,并且它提供AuthenticationHandler时时从方案列表中去找到制定方案从而得到对应的处理器类型然后创建的。如果不理解没关系,下一篇讲流程就懂了
身份验证服务AuthenticationService
身份验证中的步骤是在多个地方被调用的,身份验证中间件、授权中间件、登录的Action(如:AccountController.SignIn())、注销的Action(如:AccountController.SignOut()),身份验证的核心方法定义在这个类中,但它本质上还是去找到对应的身份验证处理器并调用其同名方法。其实这些方法还进一步以扩展方法的形式定义到HttpContext上了。以SignIn方法为例
HttpContext.SignIn() > AuthenticationService.SignIn() > AuthenticationHandler.SignIn()
后续
这一篇只尽量简单的说了下身份验证涉及到的几个核心概念,如果不明白的可以留言或等到下篇结合理解。下一篇将以用户名密码+cookie的身份验证方式来详细梳理下流程。