/// <summary>
        /// Enables the JWT bearer authentication by registering it in the specified <see cref="serviceCollection"/>.
        /// </summary>
        private static void AddJwtBearerAuthentication(IServiceCollection serviceCollection)
        {
            using ServiceProvider provider = serviceCollection.BuildServiceProvider();
            JwtAccessTokenConfig tokenConfig = provider
                                               .GetRequiredService <IOptions <JwtAccessTokenConfig> >()
                                               .Value;

            serviceCollection
            .AddAuthentication(options =>
            {
                options.DefaultAuthenticateScheme = JwtBearerDefaults.AuthenticationScheme;
                options.DefaultChallengeScheme    = JwtBearerDefaults.AuthenticationScheme;
            })
            .AddJwtBearer(o =>
            {
                o.TokenValidationParameters = new TokenValidationParameters
                {
                    ValidateLifetime         = true,
                    ValidateIssuer           = true,
                    ValidateAudience         = true,
                    ValidateIssuerSigningKey = true,

                    ClockSkew        = tokenConfig.ClockSkew,
                    ValidIssuer      = tokenConfig.ValidIssuer,
                    ValidAudience    = tokenConfig.ValidAudience,
                    IssuerSigningKey =
                        SymmetricSecurityKeyHelper.CreateFromString(tokenConfig.IssuerSigningKey)
                };
            });
        }
        /// <summary>
        /// Creates an instance of type <see cref="JwtSecurityToken"/> based on the specified parameters.
        /// </summary>
        private JwtSecurityToken CreateJwtSecurityToken(IEnumerable <Claim> claims,
                                                        SigningCredentials signingCredentials,
                                                        JwtAccessTokenConfig tokenConfig)
        {
            DateTime currentDateTime    = DateTime.Now;
            DateTime expirationDateTime = currentDateTime.Add(tokenConfig.Lifetime);

            return(new JwtSecurityToken
                   (
                       tokenConfig.ValidIssuer,
                       tokenConfig.ValidAudience,
                       claims,
                       currentDateTime,
                       expirationDateTime,
                       signingCredentials
                   ));
        }
 public JwtAccessTokenGenerator(UserManager <ApplicationUser> userManager,
                                IOptions <JwtAccessTokenConfig> tokenConfig)
 {
     _userManager = userManager;
     _tokenConfig = tokenConfig.Value;
 }