net6授权认证源码详解(二)
总结上一节的内容
先从以下代码开始
builder.Services.AddAuthentication("Bearer").AddJwtBearer("Bearer", options => {
options.Authority = "http://localhost:5100";
options.TokenValidationParameters = new Microsoft.IdentityModel.Tokens.TokenValidationParameters { ValidateAudience = false };
options.RequireHttpsMetadata = false;
});
上述代码做了些什么事?分开两步走:
1、AddAuthentication("Bearer"),设置AuthenticationOptions.DefaultScheme ="Bearer"。注册服务,返回AuthenticationBuilder。
2、AddJwtBearer("Bearer",options=>{}),注册配置JwtBearerOptions的服务JwtBearerConfigureOptions。使用第一步返回的AuthenticationBuilder,构建AuthenticationOptions类,新增HandlerType为JwtBearerHandler的AuthenticationSchemeBuilder。根据options=>{}配置JwtBearerOptions,注入JwtBearerHandler实例。
app.UseAuthentication();
接下来总结UseAuthentication()做了些什么?
1、通过AuthenticationSchemeProvider获取AuthenticationScheme中HandlerType继承IAuthenticationRequestHandler的AuthenticationScheme列表,根据AuthenticationScheme中name通过AuthenticationHandlerProvider 找到相应的handler,内部获取后会调用InitializeAsync初始化,然后执行HandleRequestAsync()。
2、通过AuthenticationSchemeProvider获取对应的AuthenticationScheme,然后根据AuthenticationScheme.name(即"Bearer"),调用IAuthencticationService.AuthenticateAsync("Bearer"),如果成功,记录User信息。
认证过程:
IAuthencticationService.AuthenticateAsync("Bearer")服务调用的仍然是JwtBearerHandler.HandleAuthenticateAsync,这里用到validator == JwtSecurityTokenHandler,JwtSecurityTokenHandler(为微软内部类,设计用于创建和验证Json Web令牌的SecurityTokenHandler,包位置:System.IdentityModel.Tokens.Jwt)。
详细代码如下:

关键代码解读:
1、validator.CanReadToken(token)//确定字符串是否是格式良好的JSON Web令牌(JWT)
2、 validator.ValidateToken(token, validationParameters, out validatedToken);//验证JwtSecurityToken并返回ClaimsPrincipal。
最后返回TokenValidatedContext。
就此已经把认证的源码都讲解研究结束,接下来需要对授权源码继续解读。

浙公网安备 33010602011771号