/// <summary>
 /// Replace a user's two factor recovery codes
 /// </summary>
 /// <param name="user"></param>
 /// <param name="recoveryCodes"></param>
 /// <param name="cancellationToken"></param>
 /// <returns></returns>
 public Task ReplaceCodesAsync(DynamoDBUser user, IEnumerable <string> recoveryCodes, CancellationToken cancellationToken)
 {
     return(Task.Run(() =>
     {
         cancellationToken.ThrowIfCancellationRequested();
         user.RecoveryCodes = recoveryCodes.ToList();
     }));
 }
 /// <summary>
 /// Get whether the phone number is confirmed
 /// </summary>
 /// <param name="user"></param>
 /// <param name="cancellationToken"></param>
 /// <returns></returns>
 public Task <bool> GetPhoneNumberConfirmedAsync(DynamoDBUser user, CancellationToken cancellationToken)
 {
     return(Task.Run(() =>
     {
         cancellationToken.ThrowIfCancellationRequested();
         return user.PhoneNumberConfirmed;
     }));
 }
 /// <summary>
 /// Get the user's password hash
 /// </summary>
 /// <param name="user"></param>
 /// <param name="cancellationToken"></param>
 /// <returns></returns>
 public Task <string> GetPasswordHashAsync(DynamoDBUser user, CancellationToken cancellationToken)
 {
     return(Task.Run(() =>
     {
         cancellationToken.ThrowIfCancellationRequested();
         return user.PasswordHash;
     }));
 }
 /// <summary>
 /// Get the user's name
 /// </summary>
 /// <param name="user"></param>
 /// <param name="cancellationToken"></param>
 /// <returns></returns>
 public Task <string> GetUserNameAsync(DynamoDBUser user, CancellationToken cancellationToken)
 {
     return(Task.Run(() =>
     {
         cancellationToken.ThrowIfCancellationRequested();
         return user.UserName;
     }));
 }
 /// <summary>
 /// Get the user's normalized email
 /// </summary>
 /// <param name="user"></param>
 /// <param name="cancellationToken"></param>
 /// <returns></returns>
 public Task <string> GetNormalizedEmailAsync(DynamoDBUser user, CancellationToken cancellationToken)
 {
     return(Task.Run(() =>
     {
         cancellationToken.ThrowIfCancellationRequested();
         return user.NormalizedEmail;
     }));
 }
 /// <summary>
 /// Enabled or disable two factor auth on the user
 /// </summary>
 /// <param name="user"></param>
 /// <param name="enabled">Bool representing whether the two factor auth is to be enabled</param>
 /// <param name="cancellationToken"></param>
 /// <returns></returns>
 public Task SetTwoFactorEnabledAsync(DynamoDBUser user, bool enabled, CancellationToken cancellationToken)
 {
     return(Task.Run(() =>
     {
         cancellationToken.ThrowIfCancellationRequested();
         user.TwoFactorEnabled = enabled;
     }));
 }
 /// <summary>
 /// Redeem a two factor recovery code
 /// </summary>
 /// <param name="user"></param>
 /// <param name="code"></param>
 /// <param name="cancellationToken"></param>
 /// <returns></returns>
 public Task <bool> RedeemCodeAsync(DynamoDBUser user, string code, CancellationToken cancellationToken)
 {
     return(Task.Run(() =>
     {
         cancellationToken.ThrowIfCancellationRequested();
         return user.RecoveryCodes.Remove(code);
     }));
 }
 /// <summary>
 /// Set a user's normalized username
 /// </summary>
 /// <param name="user"></param>
 /// <param name="normalizedName"></param>
 /// <param name="cancellationToken"></param>
 /// <returns></returns>
 public Task SetNormalizedUserNameAsync(DynamoDBUser user, string normalizedName, CancellationToken cancellationToken)
 {
     return(Task.Run(() =>
     {
         cancellationToken.ThrowIfCancellationRequested();
         user.NormalizedUserName = normalizedName;
     }));
 }
 /// <summary>
 /// Get the authenticator key
 /// </summary>
 /// <param name="user"></param>
 /// <param name="cancellationToken"></param>
 /// <returns></returns>
 public Task <string> GetAuthenticatorKeyAsync(DynamoDBUser user, CancellationToken cancellationToken)
 {
     return(Task.Run(() =>
     {
         cancellationToken.ThrowIfCancellationRequested();
         return user.AuthenticatorKey;
     }));
 }
 /// <summary>
 /// Set a user's phone number
 /// </summary>
 /// <param name="user"></param>
 /// <param name="phoneNumber">The desired phone number</param>
 /// <param name="cancellationToken"></param>
 /// <returns></returns>
 public Task SetPhoneNumberAsync(DynamoDBUser user, string phoneNumber, CancellationToken cancellationToken)
 {
     return(Task.Run(() =>
     {
         cancellationToken.ThrowIfCancellationRequested();
         user.PhoneNumber = phoneNumber;
     }));
 }
 /// <summary>
 /// Get the user's security stamp, a stamp designed to be changed whenever the
 /// user's auth info changes
 /// </summary>
 /// <param name="user"></param>
 /// <param name="cancellationToken"></param>
 /// <returns></returns>
 public Task <string> GetSecurityStampAsync(DynamoDBUser user, CancellationToken cancellationToken)
 {
     return(Task.Run(() =>
     {
         cancellationToken.ThrowIfCancellationRequested();
         return user.SecurityStamp;
     }));
 }
 /// <summary>
 /// Set whether the user's email is confirmed
 /// </summary>
 /// <param name="user"></param>
 /// <param name="confirmed"></param>
 /// <param name="cancellationToken"></param>
 /// <returns></returns>
 public Task SetEmailConfirmedAsync(DynamoDBUser user, bool confirmed, CancellationToken cancellationToken)
 {
     return(Task.Run(() =>
     {
         cancellationToken.ThrowIfCancellationRequested();
         user.EmailConfirmed = confirmed;
     }));
 }
 /// <summary>
 /// Set the user's email
 /// </summary>
 /// <param name="user"></param>
 /// <param name="email"></param>
 /// <param name="cancellationToken"></param>
 /// <returns></returns>
 public Task SetEmailAsync(DynamoDBUser user, string email, CancellationToken cancellationToken)
 {
     return(Task.Run(() =>
     {
         cancellationToken.ThrowIfCancellationRequested();
         user.Email = email;
     }));
 }
 /// <summary>
 /// Replace a claim
 /// </summary>
 /// <param name="user"></param>
 /// <param name="claim"></param>
 /// <param name="newClaim"></param>
 /// <param name="cancellationToken"></param>
 /// <returns></returns>
 public Task ReplaceClaimAsync(DynamoDBUser user, Claim claim, Claim newClaim, CancellationToken cancellationToken)
 {
     return(Task.Run(() =>
     {
         cancellationToken.ThrowIfCancellationRequested();
         RemoveClaimsAsync(user, new Claim[] { claim }, cancellationToken);
         AddClaimsAsync(user, new Claim[] { newClaim }, cancellationToken);
     }));
 }
 /// <summary>
 /// Increment the failed login count
 /// </summary>
 /// <param name="user"></param>
 /// <param name="cancellationToken"></param>
 /// <returns></returns>
 public Task <int> IncrementAccessFailedCountAsync(DynamoDBUser user, CancellationToken cancellationToken)
 {
     return(Task.Run(() =>
     {
         cancellationToken.ThrowIfCancellationRequested();
         user.AccessFailedCount = user.AccessFailedCount + 1;
         return user.AccessFailedCount;
     }));
 }
 /// <summary>
 /// Set the user's password hash
 /// </summary>
 /// <param name="user"></param>
 /// <param name="passwordHash"></param>
 /// <param name="cancellationToken"></param>
 /// <returns></returns>
 public Task SetPasswordHashAsync(DynamoDBUser user, string passwordHash, CancellationToken cancellationToken)
 {
     return(Task.Run(() =>
     {
         cancellationToken.ThrowIfCancellationRequested();
         user.SecurityStamp = Guid.NewGuid().ToString();
         user.PasswordHash = passwordHash;
     }));
 }
        /// <summary>
        /// Get the user's lockout end date
        /// </summary>
        /// <param name="user"></param>
        /// <param name="cancellationToken"></param>
        /// <returns></returns>
        public Task <DateTimeOffset?> GetLockoutEndDateAsync(DynamoDBUser user, CancellationToken cancellationToken)
        {
            return(Task.Run(() =>
            {
                cancellationToken.ThrowIfCancellationRequested();

                return (DateTimeOffset?)user.LockoutEnd;
            }));
        }
 /// <summary>
 /// Apply a claim to a user
 /// </summary>
 /// <param name="user"></param>
 /// <param name="claims"></param>
 /// <param name="cancellationToken"></param>
 /// <returns></returns>
 public Task AddClaimsAsync(DynamoDBUser user, IEnumerable <Claim> claims, CancellationToken cancellationToken)
 {
     return(Task.Run(() =>
     {
         cancellationToken.ThrowIfCancellationRequested();
         foreach (Claim claim in claims)
         {
             user.ClaimTypes.Add(claim.Type);
             user.ClaimValues.Add(claim.Value);
         }
     }));
 }
 /// <summary>
 /// Get the claims attached to a user
 /// </summary>
 /// <param name="user"></param>
 /// <param name="cancellationToken"></param>
 /// <returns></returns>
 public Task <IList <Claim> > GetClaimsAsync(DynamoDBUser user, CancellationToken cancellationToken)
 {
     return(Task.Run(() =>
     {
         cancellationToken.ThrowIfCancellationRequested();
         IList <Claim> Claims = new List <Claim>();
         for (int i = 0; i < user.ClaimTypes.Count; i++)
         {
             Claims.Add(new Claim(user.ClaimTypes[i], user.ClaimValues[i]));
         }
         return Claims;
     }));
 }
        /// <summary>
        /// Update a user already in the database
        /// </summary>
        /// <param name="user"></param>
        /// <param name="cancellationToken"></param>
        /// <returns></returns>
        public async Task <IdentityResult> UpdateAsync(DynamoDBUser user, CancellationToken cancellationToken)
        {
            cancellationToken.ThrowIfCancellationRequested();
            user.ConcurrencyStamp = Guid.NewGuid().ToString();
            IdentityResult Result       = IdentityResult.Failed();
            bool           UpdateResult = await _dataAccess.SaveUserToDB(user, cancellationToken);

            if (UpdateResult)
            {
                Result = IdentityResult.Success;
            }
            return(Result);
        }
 /// <summary>
 /// Remove all the claims in the list from the user's list of claims
 /// </summary>
 /// <param name="user"></param>
 /// <param name="claims"></param>
 /// <param name="cancellationToken"></param>
 /// <returns></returns>
 public Task RemoveClaimsAsync(DynamoDBUser user, IEnumerable <Claim> claims, CancellationToken cancellationToken)
 {
     return(Task.Run(() =>
     {
         cancellationToken.ThrowIfCancellationRequested();
         foreach (Claim claim in claims)
         {
             int index = user.ClaimTypes.IndexOf(claim.Type);
             user.ClaimTypes.Remove(claim.Type);
             user.ClaimValues.RemoveAt(index);
         }
     }));
 }
 /// <summary>
 /// Get the user's social logins
 /// </summary>
 /// <param name="user"></param>
 /// <param name="cancellationToken"></param>
 /// <returns></returns>
 public Task <IList <UserLoginInfo> > GetLoginsAsync(DynamoDBUser user, CancellationToken cancellationToken)
 {
     return(Task.Run(() =>
     {
         cancellationToken.ThrowIfCancellationRequested();
         IList <UserLoginInfo> UserLogins = new List <UserLoginInfo>();
         for (int i = 0; i < user.LoginProviders.Count; i++)
         {
             UserLogins.Add(new UserLoginInfo(user.LoginProviders[i], user.LoginProviderKeys[i], user.LoginProviderDisplayNames[i]));
         }
         return UserLogins;
     }));
 }
 /// <summary>
 /// Set the user's lockout end date
 /// </summary>
 /// <param name="user"></param>
 /// <param name="lockoutEnd"></param>
 /// <param name="cancellationToken"></param>
 /// <returns></returns>
 public Task SetLockoutEndDateAsync(DynamoDBUser user, DateTimeOffset?lockoutEnd, CancellationToken cancellationToken)
 {
     return(Task.Run(() =>
     {
         cancellationToken.ThrowIfCancellationRequested();
         if (lockoutEnd.HasValue)
         {
             user.LockoutEnd = lockoutEnd.Value;
         }
         else
         {
             user.LockoutEnd = null;
         }
     }));
 }
 /// <summary>
 /// Get whether the user has a password
 /// </summary>
 /// <param name="user"></param>
 /// <param name="cancellationToken"></param>
 /// <returns></returns>
 public Task <bool> HasPasswordAsync(DynamoDBUser user, CancellationToken cancellationToken)
 {
     return(Task.Run(() =>
     {
         cancellationToken.ThrowIfCancellationRequested();
         if (user.PasswordHash == null || user.PasswordHash.Count() == 0)
         {
             return false;
         }
         else
         {
             return true;
         }
     }));
 }
 /// <summary>
 /// Get the number of two factor auth recovery codes the user has
 /// </summary>
 /// <param name="user"></param>
 /// <param name="cancellationToken"></param>
 /// <returns></returns>
 public Task <int> CountCodesAsync(DynamoDBUser user, CancellationToken cancellationToken)
 {
     return(Task.Run(() =>
     {
         cancellationToken.ThrowIfCancellationRequested();
         if (user.RecoveryCodes != null)
         {
             return user.RecoveryCodes.Count;
         }
         else
         {
             return 0;
         }
     }));
 }
 /// <summary>
 /// Get the value of a authentication token
 /// </summary>
 /// <param name="user"></param>
 /// <param name="loginProvider"></param>
 /// <param name="name"></param>
 /// <param name="cancellationToken"></param>
 /// <returns></returns>
 public Task <string> GetTokenAsync(DynamoDBUser user, string loginProvider, string name, CancellationToken cancellationToken)
 {
     return(Task.Run(() =>
     {
         cancellationToken.ThrowIfCancellationRequested();
         for (int i = 0; i < user.TokenValues.Count; i++)
         {
             if (user.TokenLoginProviders[i] == loginProvider && user.TokenNames[i] == name)
             {
                 return user.TokenValues[i];
             }
         }
         return null;
     }));
 }
 /// <summary>
 /// Add a user to a role.
 /// </summary>
 /// <param name="user"></param>
 /// <param name="roleName">Should be the normalized role name</param>
 /// <param name="cancellationToken"></param>
 /// <returns></returns>
 public Task AddToRoleAsync(DynamoDBUser user, string roleName, CancellationToken cancellationToken)
 {
     return(Task.Run(() =>
     {
         cancellationToken.ThrowIfCancellationRequested();
         if (user.Roles.Any(item => { return item == roleName; }))
         {
             return;
         }
         else
         {
             user.Roles.Add(roleName);
         }
     }));
 }
 /// <summary>
 /// Add a social login to a user. This involves breaking it into strings for DynamoDB
 /// compatibility
 /// </summary>
 /// <param name="user"></param>
 /// <param name="login">The desired login</param>
 /// <param name="cancellationToken"></param>
 /// <returns></returns>
 public Task AddLoginAsync(DynamoDBUser user, UserLoginInfo login, CancellationToken cancellationToken)
 {
     return(Task.Run(() =>
     {
         cancellationToken.ThrowIfCancellationRequested();
         for (int i = 0; i < user.LoginProviders.Count; i++)
         {
             if (user.LoginProviders[i] == login.LoginProvider && user.LoginProviderKeys[i] == login.ProviderKey && user.LoginProviderDisplayNames[i] == login.LoginProvider)
             {
                 return;
             }
         }
         user.LoginProviderDisplayNames.Add(login.ProviderDisplayName);
         user.LoginProviderKeys.Add(login.ProviderKey);
         user.LoginProviders.Add(login.LoginProvider);
     }));
 }
 /// <summary>
 /// Add an authentication token to the user
 /// </summary>
 /// <param name="user"></param>
 /// <param name="loginProvider"></param>
 /// <param name="name"></param>
 /// <param name="value"></param>
 /// <param name="cancellationToken"></param>
 /// <returns></returns>
 public Task SetTokenAsync(DynamoDBUser user, string loginProvider, string name, string value, CancellationToken cancellationToken)
 {
     return(Task.Run(() =>
     {
         cancellationToken.ThrowIfCancellationRequested();
         for (int i = 0; i < user.TokenValues.Count; i++)
         {
             if (user.TokenLoginProviders[i] == loginProvider && user.TokenNames[i] == name)
             {
                 user.TokenValues[i] = value;
                 return;
             }
         }
         user.TokenLoginProviders.Add(loginProvider);
         user.TokenNames.Add(name);
         user.TokenValues.Add(value);
     }));
 }
 /// <summary>
 /// Remove a social login from a user
 /// </summary>
 /// <param name="user"></param>
 /// <param name="loginProvider">Name of the login provider</param>
 /// <param name="providerKey">Key from the provider unique to the user</param>
 /// <param name="cancellationToken"></param>
 /// <returns></returns>
 public Task RemoveLoginAsync(DynamoDBUser user, string loginProvider, string providerKey, CancellationToken cancellationToken)
 {
     return(Task.Run(() =>
     {
         cancellationToken.ThrowIfCancellationRequested();
         user.SecurityStamp = Guid.NewGuid().ToString();
         for (int i = 0; i < user.LoginProviderKeys.Count; i++)
         {
             if (user.LoginProviderKeys[i] == providerKey)
             {
                 user.LoginProviderKeys.RemoveAt(i);
                 user.LoginProviderDisplayNames.RemoveAt(i);
                 user.LoginProviders.RemoveAt(i);
                 break;
             }
         }
     }));
 }