public virtual async Task CreateAsync(AuthenticationTokenCreateContext context)
        {
            var clientId = context.Ticket.Properties.Dictionary["as:client_id"];
            if (string.IsNullOrEmpty(clientId))
                return;

            var refreshTokenId = Guid.NewGuid().ToString("n");

            await Task.Run(() => {

                var refreshTokenLifeTime = context.OwinContext.Get<string>("as:clientRefreshTokenLifeTime");

                var token = new OAuthRefreshToken()
                {
                    Key = refreshTokenId.GenerateHash(),
                    ClientId = clientId,
                    Subject = context.Ticket.Identity.Name,
                    UserType = UserType.Name,
                    IssuedUtc = DateTime.UtcNow,
                    ExpiresUtc = DateTime.UtcNow.AddMinutes(Convert.ToDouble(refreshTokenLifeTime))
                };

                context.Ticket.Properties.IssuedUtc = token.IssuedUtc;
                context.Ticket.Properties.ExpiresUtc = token.ExpiresUtc;

                token.ProtectedTicket = context.SerializeTicket();

                this._oauthStore.AddRefreshToken(token);

            });

            context.SetToken(refreshTokenId);
        }
        public void AddRefreshToken(OAuthRefreshToken token)
        {
            this.Db.Execute("DELETE FROM [OAuthRefreshToken] WHERE [Subject] = @0 AND [ClientId] = @1 AND [UserType] = @3",
                token.Subject,
                token.ClientId,
                token.UserType);

            this.Db.Save(token);
        }