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。

就此已经把认证的源码都讲解研究结束,接下来需要对授权源码继续解读。

 

posted @ 2022-09-17 18:00  回到七点  阅读(177)  评论(0)    收藏  举报