Пример #1
0
        public IActionResult Post(object encryptObject)
        {
            try
            {
                IHeaderDictionary headers     = _httpContextAccessor.HttpContext.Request.Headers;
                string            accessToken = headers.Where(x => x.Key == "Authorization").Select(x => x.Value).FirstOrDefault();
                if (string.IsNullOrEmpty(accessToken))
                {
                    return(BadRequest("Invalid Authorization"));
                }

                accessToken = accessToken.Substring(7);

                string jsonString = AESGCM.Decrypt(encryptObject.ToString(), accessToken);
                string input      = JsonConvert.DeserializeObject <string>(jsonString);

                ApplicationRole role = _dbContext.Roles
                                       .Include("RoleClaims")
                                       .Where(x => x.Id == input)
                                       .FirstOrDefault();

                jsonString = JsonConvert.SerializeObject(role, new JsonSerializerSettings()
                {
                    ReferenceLoopHandling = ReferenceLoopHandling.Ignore
                });
                string encryptString = AESGCM.Encrypt(jsonString, accessToken);
                return(new JsonResult(encryptString));
            }
            catch (Exception exception)
            {
                _logger.Exception(exception);
                return(BadRequest(exception));
            }
        }
Пример #2
0
        /// <summary>
        /// Custom GetRoleClaimHistory Method
        /// </summary>
        /// <param name="userRoleClaimId">string</param>
        /// <param name="cancellationToken">CancellationToken</param>
        /// <returns>Task&lt;List&lt;AspNetUserRoleClaimHistory&gt;&gt;</returns>
        /// <method>GetRoleClaimHistory(CancellationToken cancellationToken)</method>
        public async Task <List <AspNetUserRoleClaimHistory> > GetRoleClaimHistory(string userRoleClaimId, CancellationToken cancellationToken)
        {
            try
            {
                string accessToken = await GetAccessToken();

                string jsonString    = JsonConvert.SerializeObject(userRoleClaimId.Clean());
                string encryptString = AESGCM.Encrypt(jsonString, accessToken);

                JsonClient     jsonClient = new JsonClient(_apiBaseUrl, accessToken);
                HttpStatusCode statusCode = await jsonClient.SendRequest(HttpMethod.Post, "User/RoleClaimHistory", encryptString);

                if (!jsonClient.IsResponseSuccess)
                {
                    _logger.Exception(new Exception(jsonClient.GetResponseString()));
                    throw new Exception(jsonClient.GetResponseString());
                }

                jsonString = AESGCM.Decrypt(jsonClient.GetResponseObject <string>(), accessToken);
                List <AspNetUserRoleClaimHistory> history = JsonConvert.DeserializeObject <List <AspNetUserRoleClaimHistory> >(jsonString);

                return(history);
            }
            catch (Exception exception)
            {
                _logger.Exception(exception);
                throw;
            }
        }
Пример #3
0
        /// <summary>
        /// Implemented IUserClaimStore GetUsersForClaimAsync Method
        /// </summary>
        /// <param name="claim">Claim</param>
        /// <param name="cancellationToken">CancellationToken</param>
        /// <returns>Task</returns>
        /// <method>GetUsersForClaimAsync(Claim claim, CancellationToken cancellationToken)</method>
        public async Task <IList <ApplicationUser> > GetUsersForClaimAsync(Claim claim, CancellationToken cancellationToken)
        {
            try
            {
                string accessToken = await GetAccessToken();

                string jsonString = JsonConvert.SerializeObject(claim, new JsonSerializerSettings()
                {
                    ReferenceLoopHandling = ReferenceLoopHandling.Ignore
                });
                string encryptString = AESGCM.Encrypt(jsonString, accessToken);

                JsonClient     jsonClient = new JsonClient(_apiBaseUrl, accessToken);
                HttpStatusCode statusCode = await jsonClient.SendRequest(HttpMethod.Post, "User/FindByClaim", encryptString);

                if (!jsonClient.IsResponseSuccess)
                {
                    _logger.Exception(new Exception(jsonClient.GetResponseString()));
                    throw new Exception(jsonClient.GetResponseString());
                }

                jsonString = AESGCM.Decrypt(jsonClient.GetResponseObject <string>(), accessToken);
                List <ApplicationUser> users = JsonConvert.DeserializeObject <List <ApplicationUser> >(jsonString);

                return(users);
            }
            catch (Exception exception)
            {
                _logger.Exception(exception);
                throw;
            }
        }
Пример #4
0
        /// <summary>
        /// Implemented IUserEmailStore FindByEmailAsync Method
        /// </summary>
        /// <param name="normalizedEmail">string</param>
        /// <param name="cancellationToken">CancellationToken</param>
        /// <returns>Task&lt;ApplicationUser&gt;</returns>
        /// <method>FindByEmailAsync(string normalizedEmail, CancellationToken cancellationToken)</method>
        public async Task <ApplicationUser> FindByEmailAsync(string normalizedEmail, CancellationToken cancellationToken)
        {
            try
            {
                string accessToken = await GetAccessToken();

                string jsonString    = JsonConvert.SerializeObject(normalizedEmail.Clean().ToUpper());
                string encryptString = AESGCM.Encrypt(jsonString, accessToken);

                JsonClient     jsonClient = new JsonClient(_apiBaseUrl, accessToken);
                HttpStatusCode statusCode = await jsonClient.SendRequest(HttpMethod.Post, "User/FindByNormalizedEmail", encryptString);

                if (!jsonClient.IsResponseSuccess)
                {
                    _logger.Exception(new Exception(jsonClient.GetResponseString()));
                    throw new Exception(jsonClient.GetResponseString());
                }

                jsonString = AESGCM.Decrypt(jsonClient.GetResponseObject <string>(), accessToken);
                ApplicationUser user = JsonConvert.DeserializeObject <ApplicationUser>(jsonString);

                return(user);
            }
            catch (Exception exception)
            {
                _logger.Exception(exception);
                throw;
            }
        }
Пример #5
0
        /// <summary>
        /// Custom GetPendingRegistrations Method
        /// </summary>
        /// <param name="cancellationToken">CancellationToken</param>
        /// <returns>Task&lt;List&lt;ApplicationUser&gt;&gt;</returns>
        /// <method>CreateAsync(CancellationToken cancellationToken)</method>
        public async Task <List <ApplicationUser> > GetPendingRegistrations(CancellationToken cancellationToken)
        {
            try
            {
                string accessToken = await GetAccessToken();

                JsonClient     jsonClient = new JsonClient(_apiBaseUrl, accessToken);
                HttpStatusCode statusCode = await jsonClient.SendRequest(HttpMethod.Post, "User/PendingRegistrations");

                if (!jsonClient.IsResponseSuccess)
                {
                    _logger.Exception(new Exception(jsonClient.GetResponseString()));
                    throw new Exception(jsonClient.GetResponseString());
                }

                string jsonString            = AESGCM.Decrypt(jsonClient.GetResponseObject <string>(), accessToken);
                List <ApplicationUser> users = JsonConvert.DeserializeObject <List <ApplicationUser> >(jsonString);

                return(users);
            }
            catch (Exception exception)
            {
                _logger.Exception(exception);
                throw;
            }
        }
Пример #6
0
        /// <summary>
        /// Implemented IUserLoginStore FindByLoginAsync Method
        /// </summary>
        /// <param name="loginProvider">string</param>
        /// <param name="providerKey">string</param>
        /// <param name="cancellationToken">CancellationToken</param>
        /// <returns>Task&lt;ApplicationUser&gt;</returns>
        /// <method>FindByLoginAsync(string loginProvider, string providerKey, CancellationToken cancellationToken)</method>
        public async Task <ApplicationUser> FindByLoginAsync(string loginProvider, string providerKey, CancellationToken cancellationToken)
        {
            try
            {
                IdentityUserLogin <string> input = new IdentityUserLogin <string>();
                input.LoginProvider = loginProvider.Clean();
                input.ProviderKey   = providerKey.Clean();

                string accessToken = await GetAccessToken();

                string jsonString    = JsonConvert.SerializeObject(input);
                string encryptString = AESGCM.Encrypt(jsonString, accessToken);

                JsonClient     jsonClient = new JsonClient(_apiBaseUrl, accessToken);
                HttpStatusCode statusCode = await jsonClient.SendRequest(HttpMethod.Post, "User/FindByLogin", encryptString);

                if (!jsonClient.IsResponseSuccess)
                {
                    _logger.Exception(new Exception(jsonClient.GetResponseString()));
                    throw new Exception(jsonClient.GetResponseString());
                }

                jsonString = AESGCM.Decrypt(jsonClient.GetResponseObject <string>(), accessToken);
                ApplicationUser user = JsonConvert.DeserializeObject <ApplicationUser>(jsonString);

                return(user);
            }
            catch (Exception exception)
            {
                _logger.Exception(exception);
                throw;
            }
        }
Пример #7
0
        /// <summary>
        /// Implemented IRoleStore Method
        /// </summary>
        /// <param name="roleId">string</param>
        /// <param name="cancellationToken">CancellationToken</param>
        /// <returns>Task&lt;ApplicationRole&gt;</returns>
        /// <method>FindByIdAsync(string roleId, CancellationToken cancellationToken = default(CancellationToken))</method>
        public async Task <ApplicationRole> FindByIdAsync(string roleId, CancellationToken cancellationToken = default(CancellationToken))
        {
            try
            {
                string accessToken = await GetAccessToken();

                string jsonString    = JsonConvert.SerializeObject(roleId.Clean());
                string encryptString = AESGCM.Encrypt(jsonString, accessToken);

                JsonClient     jsonClient = new JsonClient(_apiBaseUrl, accessToken);
                HttpStatusCode statusCode = await jsonClient.SendRequest(HttpMethod.Post, "Role/FindById", encryptString);

                if (!jsonClient.IsResponseSuccess)
                {
                    _logger.Exception(new Exception(jsonClient.GetResponseString()));
                    throw new Exception(jsonClient.GetResponseString());
                }

                jsonString = AESGCM.Decrypt(jsonClient.GetResponseObject <string>(), accessToken);
                ApplicationRole role = JsonConvert.DeserializeObject <ApplicationRole>(jsonString);

                return(role);
            }
            catch (Exception exception)
            {
                _logger.Exception(exception);
                throw;
            }
        }
Пример #8
0
        /// <summary>
        /// Custom GetApprovedUsersAsync Method
        /// </summary>
        /// <param name="roleId">string</param>
        /// <param name="roleClaimId">int</param>
        /// <param name="cancellationToken">CancellationToken</param>
        /// <returns>Task&lt;List&lt;ApplicationUser&gt;&gt;</returns>
        /// <method>GetApprovedUsersAsync(string roleId, int roleClaimId, CancellationToken cancellationToken = default(CancellationToken))</method>
        public async Task <List <ApplicationUser> > GetApprovedUsersAsync(string roleId, int roleClaimId, CancellationToken cancellationToken = default(CancellationToken))
        {
            try
            {
                string accessToken = await GetAccessToken();

                string jsonString    = JsonConvert.SerializeObject(new KeyValuePair <string, int>(roleId.Clean(), roleClaimId));
                string encryptString = AESGCM.Encrypt(jsonString, accessToken);

                JsonClient     jsonClient = new JsonClient(_apiBaseUrl, accessToken);
                HttpStatusCode statusCode = await jsonClient.SendRequest(HttpMethod.Post, "Role/GetApprovedUsers", encryptString);

                if (!jsonClient.IsResponseSuccess)
                {
                    _logger.Exception(new Exception(jsonClient.GetResponseString()));
                    throw new Exception(jsonClient.GetResponseString());
                }

                jsonString = AESGCM.Decrypt(jsonClient.GetResponseObject <string>(), accessToken);
                List <ApplicationUser> users = JsonConvert.DeserializeObject <List <ApplicationUser> >(jsonString);

                return(users);
            }
            catch (Exception exception)
            {
                _logger.Exception(exception);
                throw;
            }
        }
Пример #9
0
        public IActionResult Post(object encryptObject)
        {
            using (var dbContextTransaction = _dbContext.Database.BeginTransaction())
            {
                try
                {
                    IHeaderDictionary headers     = _httpContextAccessor.HttpContext.Request.Headers;
                    string            accessToken = headers.Where(x => x.Key == "Authorization").Select(x => x.Value).FirstOrDefault();
                    if (string.IsNullOrEmpty(accessToken))
                    {
                        return(BadRequest("Invalid Authorization"));
                    }

                    accessToken = accessToken.Substring(7);

                    string          jsonString = AESGCM.Decrypt(encryptObject.ToString(), accessToken);
                    ApplicationRole input      = JsonConvert.DeserializeObject <ApplicationRole>(jsonString);

                    _dbContext.Roles.Add(input);
                    _dbContext.SaveChanges();
                    dbContextTransaction.Commit();

                    return(Ok());
                }
                catch (Exception exception)
                {
                    dbContextTransaction.Rollback();
                    _logger.Exception(exception);
                    return(BadRequest(exception));
                }
            }
        }
Пример #10
0
        /// <summary>
        /// Method to return decrypted object from Http Session
        /// </summary>
        /// <param name="session">ISession</param>
        /// <param name="key">string</param>
        /// <returns>&lt;T&gt;</returns>
        /// <method>Decrypt&lt;T&gt;(this ISession session, string key)</method>
        public static async Task <T> Decrypt <T>(this ISession session, string key)
        {
            await session.LoadAsync();

            var value = session.GetString(key);

            return(value == null ? default : JsonSerializer.Deserialize <T>(AESGCM.Decrypt(value)));
        }
Пример #11
0
        public byte[] Decrypt(byte[] payload)
        {
            var pubKey = PublicKey.FromBytes(payload.Take(33).ToArray());
            var aesKey = ECDH(pubKey);
            var aes    = new AESGCM(aesKey);

            return(aes.Decrypt(payload, 33));
        }
Пример #12
0
        public void DecryptTest()
        {
            var key        = "349c469e0ea9eb8822658aaf0817a221d7fd4be78b243f455d72b60f9b1a3a4e".ParseHex();
            var ciphertext = "1881342a2930cdc2734ae15e143a09fe5b0a5f113b0e2fcfc8d56f23c508a2890d7139c592cf4e4c76758a9b2317cb94".ParseHex();
            var expected   = Encoding.ASCII.GetBytes("a secret message");
            var aes        = new AESGCM(key);
            var actual     = aes.Decrypt(ciphertext);

            CollectionAssert.AreEqual(expected, actual);
        }
        public IActionResult Post(object encryptObject)
        {
            try
            {
                IHeaderDictionary headers     = _httpContextAccessor.HttpContext.Request.Headers;
                string            accessToken = headers.Where(x => x.Key == "Authorization").Select(x => x.Value).FirstOrDefault();
                if (string.IsNullOrEmpty(accessToken))
                {
                    return(BadRequest("Invalid Authorization"));
                }

                accessToken = accessToken.Substring(7);

                string jsonString = AESGCM.Decrypt(encryptObject.ToString(), accessToken);
                IdentityUserLogin <string> input = JsonConvert.DeserializeObject <IdentityUserLogin <string> >(jsonString);

                ApplicationUser user = _dbContext.Users
                                       .Join(_dbContext.UserLogins, Users => Users.Id, UserLogins => UserLogins.UserId, (Users, UserLogins) => new { Users, UserLogins })
                                       .Where(x => x.UserLogins.ProviderKey == input.ProviderKey)
                                       .Where(x => x.UserLogins.LoginProvider == input.LoginProvider)
                                       .Select(x => x.Users)
                                       .Include("Claims")
                                       .Include("Logins")
                                       .Include("Tokens")
                                       .Include("RoleClaims")
                                       //.Include("RoleClaims.User")
                                       .Include("RoleClaims.Role")
                                       .Include("RoleClaims.RoleClaim")
                                       .Include("RoleClaims.History")
                                       .Include("RoleClaims.History.ActionBy")
                                       //.Include("RoleClaims.History.UserRoleClaim")
                                       .FirstOrDefault();

                jsonString = JsonConvert.SerializeObject(user, new JsonSerializerSettings()
                {
                    ReferenceLoopHandling = ReferenceLoopHandling.Ignore
                });
                string encryptString = AESGCM.Encrypt(jsonString, accessToken);
                return(new JsonResult(encryptString));
            }
            catch (Exception exception)
            {
                _logger.Exception(exception);
                return(BadRequest(exception));
            }
        }
Пример #14
0
        public IActionResult Post(object encryptObject)
        {
            try
            {
                IHeaderDictionary headers     = _httpContextAccessor.HttpContext.Request.Headers;
                string            accessToken = headers.Where(x => x.Key == "Authorization").Select(x => x.Value).FirstOrDefault();
                if (string.IsNullOrEmpty(accessToken))
                {
                    return(BadRequest("Invalid Authorization"));
                }

                accessToken = accessToken.Substring(7);

                string jsonString = AESGCM.Decrypt(encryptObject.ToString(), accessToken);
                KeyValuePair <string, int> input = JsonConvert.DeserializeObject <KeyValuePair <string, int> >(jsonString);

                List <ApplicationUser> users = _dbContext.Users
                                               .Join(_dbContext.UserRoleClaims, Users => Users.Id, UserRoleClaims => UserRoleClaims.UserId, (Users, UserRoleClaims) => new { Users, UserRoleClaims })
                                               .Where(x => x.UserRoleClaims.RoleId == input.Key)
                                               .Where(x => x.UserRoleClaims.RoleClaimId == input.Value)
                                               .Where(x => x.UserRoleClaims.Status == AspNetUserRoleClaim.RoleClaimStatus.Approved)
                                               .Select(x => x.Users)
                                               .Include("Claims")
                                               .Include("Logins")
                                               .Include("Tokens")
                                               .Include("RoleClaims")
                                               .Include("RoleClaims.Role")
                                               .Include("RoleClaims.RoleClaim")
                                               .ToList();

                jsonString = JsonConvert.SerializeObject(users, new JsonSerializerSettings()
                {
                    ReferenceLoopHandling = ReferenceLoopHandling.Ignore
                });
                string encryptString = AESGCM.Encrypt(jsonString, accessToken);
                return(new JsonResult(encryptString));
            }
            catch (Exception exception)
            {
                _logger.Exception(exception);
                return(BadRequest(exception));
            }
        }
Пример #15
0
        /// <summary>
        /// Method to return dictionary of values for given key stored in cookie
        /// </summary>
        /// <param name="cookieKey">string</param>
        /// <returns>Dictionary&lt;string, string%gt;</returns>
        /// <exception>Requires HttpRequest</exception>
        /// <method>GetAllValues(string sessionkey)</method>
        public Dictionary <string, string> GetAllValues(string cookieKey)
        {
            if (_request == null)
            {
                throw new Exception("Invalid operation, request cannot be null");
            }

            Dictionary <string, string> form = new Dictionary <string, string>();

            if (_request.Cookies[cookieKey] != null)
            {
                var cookieValue = _request.Cookies[cookieKey];
                Dictionary <string, string> encryptedForm = JsonConvert.DeserializeObject <Dictionary <string, string> >(cookieValue);
                foreach (var item in encryptedForm)
                {
                    form.Add(item.Key, AESGCM.Decrypt(item.Value));
                }
            }

            return(form);
        }
Пример #16
0
        /// <summary>
        /// Method to return value for given key in dictonary stored in cookie
        /// </summary>
        /// <param name="cookieKey">string</param>
        /// <param name="key">string</param>
        /// <returns>string</returns>
        /// <exception>Requires HttpRequest</exception>
        /// <method>GetValue(string cookieKey, string key)</method>
        public string GetValue(string cookieKey, string key)
        {
            if (_request == null)
            {
                throw new Exception("Invalid operation, request cannot be null");
            }

            string value = string.Empty;

            if (_request.Cookies[cookieKey] != null)
            {
                var cookieValue = _request.Cookies[cookieKey];
                Dictionary <string, string> form = JsonConvert.DeserializeObject <Dictionary <string, string> >(cookieValue);
                if (form.ContainsKey(key))
                {
                    value = AESGCM.Decrypt(form[key]);
                }
            }

            return(value);
        }
Пример #17
0
        public IActionResult Post(object encryptObject)
        {
            using (var dbContextTransaction = _dbContext.Database.BeginTransaction())
            {
                try
                {
                    IHeaderDictionary headers     = _httpContextAccessor.HttpContext.Request.Headers;
                    string            accessToken = headers.Where(x => x.Key == "Authorization").Select(x => x.Value).FirstOrDefault();
                    if (string.IsNullOrEmpty(accessToken))
                    {
                        return(BadRequest("Invalid Authorization"));
                    }

                    accessToken = accessToken.Substring(7);

                    string          jsonString = AESGCM.Decrypt(encryptObject.ToString(), accessToken);
                    ApplicationRole input      = JsonConvert.DeserializeObject <ApplicationRole>(jsonString);

                    ApplicationRole role = _dbContext.Roles
                                           .Include("RoleClaims")
                                           .Where(x => x.Id == input.Id)
                                           .FirstOrDefault();

                    if (role != null)
                    {
                        if (role.ConcurrencyStamp != input.ConcurrencyStamp)
                        {
                            role.ConcurrencyStamp = input.ConcurrencyStamp;
                        }
                        if (role.Name != input.Name)
                        {
                            role.Name           = input.Name;
                            role.NormalizedName = input.NormalizedName.Trim().ToUpper();
                        }

                        // remove Claims
                        foreach (ApplicationRoleClaim roleClaim in role.RoleClaims.ToArray())
                        {
                            var inputClaim = input.RoleClaims
                                             .Where(x => x.ClaimType.Trim().ToUpper() == roleClaim.ClaimType.Trim().ToUpper() && x.ClaimValue.Trim().ToUpper() == roleClaim.ClaimValue.Trim().ToUpper())
                                             .FirstOrDefault();

                            if (inputClaim == null)
                            {
                                role.RoleClaims.Remove(roleClaim);
                                _dbContext.Entry(roleClaim).State = EntityState.Deleted;
                            }
                        }

                        // add Claims
                        foreach (ApplicationRoleClaim inputClaim in input.RoleClaims)
                        {
                            var roleClaim = role.RoleClaims
                                            .Where(x => x.ClaimType.Trim().ToUpper() == inputClaim.ClaimType.Trim().ToUpper() && x.ClaimValue.Trim().ToUpper() == inputClaim.ClaimValue.Trim().ToUpper())
                                            .FirstOrDefault();

                            if (roleClaim == null)
                            {
                                role.RoleClaims.Add(inputClaim);
                            }
                        }

                        // save changes
                        if (_dbContext.HasUnsavedChanges())
                        {
                            _dbContext.Roles.Update(role);
                            _dbContext.SaveChanges();
                            dbContextTransaction.Commit();
                        }
                    }

                    return(Ok());
                }
                catch (Exception exception)
                {
                    dbContextTransaction.Rollback();
                    _logger.Exception(exception);
                    return(BadRequest(exception));
                }
            }
        }
Пример #18
0
        public IActionResult Post(object encryptObject)
        {
            using (var dbContextTransaction = _dbContext.Database.BeginTransaction())
            {
                try
                {
                    IHeaderDictionary headers     = _httpContextAccessor.HttpContext.Request.Headers;
                    string            accessToken = headers.Where(x => x.Key == "Authorization").Select(x => x.Value).FirstOrDefault();
                    if (string.IsNullOrEmpty(accessToken))
                    {
                        return(BadRequest("Invalid Authorization"));
                    }

                    accessToken = accessToken.Substring(7);

                    string          jsonString = AESGCM.Decrypt(encryptObject.ToString(), accessToken);
                    ApplicationUser input      = JsonConvert.DeserializeObject <ApplicationUser>(jsonString);

                    ApplicationUser user = _dbContext.Users
                                           .Include("Claims")
                                           .Include("Logins")
                                           .Include("Tokens")
                                           .Include("RoleClaims")
                                           //.Include("RoleClaims.User")
                                           .Include("RoleClaims.Role")
                                           .Include("RoleClaims.RoleClaim")
                                           .Include("RoleClaims.History")
                                           .Include("RoleClaims.History.ActionBy")
                                           //.Include("RoleClaims.History.UserRoleClaim")
                                           .Where(x => x.Id == input.Id)
                                           .FirstOrDefault();

                    if (user != null)
                    {
                        if (user.AccessFailedCount != input.AccessFailedCount)
                        {
                            user.AccessFailedCount = input.AccessFailedCount;
                        }
                        if (user.ApprovedById != input.ApprovedById)
                        {
                            user.ApprovedById = input.ApprovedById;
                        }
                        if (user.ApprovedDate != input.ApprovedDate)
                        {
                            user.ApprovedDate = input.ApprovedDate;
                        }
                        if (user.ConcurrencyStamp != input.ConcurrencyStamp)
                        {
                            user.ConcurrencyStamp = input.ConcurrencyStamp;
                        }
                        if (user.Email != input.Email)
                        {
                            user.Email           = input.Email;
                            user.NormalizedEmail = input.Email.Trim().ToUpper();
                        }
                        if (user.EmailConfirmed != input.EmailConfirmed)
                        {
                            user.EmailConfirmed = input.EmailConfirmed;
                        }
                        if (user.UserName != input.UserName)
                        {
                            user.UserName           = input.UserName;
                            user.NormalizedUserName = input.UserName.Trim().ToUpper();
                        }
                        if (user.FirstName != input.FirstName)
                        {
                            user.FirstName = input.FirstName;
                        }
                        if (user.LastName != input.LastName)
                        {
                            user.LastName = input.LastName;
                        }
                        if (user.LockoutEnabled != input.LockoutEnabled)
                        {
                            user.LockoutEnabled = input.LockoutEnabled;
                        }
                        if (user.LockoutEnd != input.LockoutEnd)
                        {
                            user.LockoutEnd = input.LockoutEnd;
                        }
                        if (user.PasswordHash != input.PasswordHash)
                        {
                            user.PasswordHash = input.PasswordHash;
                        }
                        if (user.PhoneNumber != input.PhoneNumber)
                        {
                            user.PhoneNumber = input.PhoneNumber;
                        }
                        if (user.PhoneNumberConfirmed != input.PhoneNumberConfirmed)
                        {
                            user.PhoneNumberConfirmed = input.PhoneNumberConfirmed;
                        }
                        if (user.RequestDate != input.RequestDate)
                        {
                            user.RequestDate = input.RequestDate;
                        }
                        if (user.RevokedById != input.RevokedById)
                        {
                            user.RevokedById = input.RevokedById;
                        }
                        if (user.RevokedDate != input.RevokedDate)
                        {
                            user.RevokedDate = input.RevokedDate;
                        }
                        if (user.TwoFactorEnabled != input.TwoFactorEnabled)
                        {
                            user.TwoFactorEnabled = input.TwoFactorEnabled;
                        }

                        // remove Claims
                        foreach (IdentityUserClaim <string> userClaim in user.Claims.ToArray())
                        {
                            var inputClaim = input.Claims
                                             .Where(x => x.ClaimType.Trim().ToUpper() == userClaim.ClaimType.Trim().ToUpper() && x.ClaimValue.Trim().ToUpper() == userClaim.ClaimValue.Trim().ToUpper())
                                             .FirstOrDefault();

                            if (inputClaim == null)
                            {
                                user.Claims.Remove(userClaim);
                                _dbContext.Entry(userClaim).State = EntityState.Deleted;
                            }
                        }

                        // add Claims
                        foreach (IdentityUserClaim <string> inputClaim in input.Claims)
                        {
                            var userClaim = user.Claims.ToArray()
                                            .Where(x => x.ClaimType.Trim().ToUpper() == inputClaim.ClaimType.Trim().ToUpper() && x.ClaimValue.Trim().ToUpper() == inputClaim.ClaimValue.Trim().ToUpper())
                                            .FirstOrDefault();

                            if (userClaim == null)
                            {
                                user.Claims.Add(inputClaim);
                            }
                        }

                        // remove Logins
                        foreach (IdentityUserLogin <string> userLogin in user.Logins.ToArray())
                        {
                            var inputLogin = input.Logins
                                             .Where(x => x.LoginProvider.Trim().ToUpper() == userLogin.LoginProvider.Trim().ToUpper() && x.ProviderKey.Trim().ToUpper() == userLogin.ProviderKey.Trim().ToUpper())
                                             .FirstOrDefault();

                            if (inputLogin == null)
                            {
                                user.Logins.Remove(userLogin);
                                _dbContext.Entry(userLogin).State = EntityState.Deleted;
                            }
                        }

                        // add Logins
                        foreach (IdentityUserLogin <string> inputLogin in input.Logins)
                        {
                            var userLogin = user.Logins.ToArray()
                                            .Where(x => x.LoginProvider.Trim().ToUpper() == inputLogin.LoginProvider.Trim().ToUpper() && x.ProviderKey.Trim().ToUpper() == inputLogin.ProviderKey.Trim().ToUpper())
                                            .FirstOrDefault();

                            if (userLogin == null)
                            {
                                user.Logins.Add(inputLogin);
                            }
                        }

                        // remove Tokens
                        foreach (IdentityUserToken <string> userToken in user.Tokens.ToArray())
                        {
                            var inputToken = input.Tokens
                                             .Where(x => x.LoginProvider.Trim().ToUpper() == userToken.LoginProvider.Trim().ToUpper() && x.Name.Trim().ToUpper() == userToken.Name.Trim().ToUpper() && x.Value.Trim().ToUpper() == userToken.Value.Trim().ToUpper())
                                             .FirstOrDefault();

                            if (inputToken == null)
                            {
                                user.Tokens.Remove(userToken);
                                _dbContext.Entry(userToken).State = EntityState.Deleted;
                            }
                        }

                        // add Tokens
                        foreach (IdentityUserToken <string> inputToken in input.Tokens)
                        {
                            var userToken = user.Tokens.ToArray()
                                            .Where(x => x.LoginProvider.Trim().ToUpper() == inputToken.LoginProvider.Trim().ToUpper() && x.Name.Trim().ToUpper() == inputToken.Name.Trim().ToUpper() && x.Value.Trim().ToUpper() == inputToken.Value.Trim().ToUpper())
                                            .FirstOrDefault();

                            if (userToken == null)
                            {
                                user.Tokens.Add(inputToken);
                            }
                        }

                        // remove RoleClaims
                        foreach (AspNetUserRoleClaim userRoleClaim in user.RoleClaims.ToArray())
                        {
                            user.RoleClaims.Remove(userRoleClaim);
                            _dbContext.Entry(userRoleClaim).State = EntityState.Deleted;
                        }

                        // add RoleClaims
                        foreach (AspNetUserRoleClaim inputRoleClaim in input.RoleClaims)
                        {
                            var userRoleClaim = user.RoleClaims
                                                .Where(x => x.RoleId == inputRoleClaim.RoleId &&
                                                       x.RoleClaimId == inputRoleClaim.RoleClaimId)
                                                .FirstOrDefault();

                            if (userRoleClaim == null)
                            {
                                if (inputRoleClaim.User == null)
                                {
                                    inputRoleClaim.User = user;
                                }

                                foreach (AspNetUserRoleClaimHistory inputHistory in inputRoleClaim.History)
                                {
                                    if (inputHistory.UserRoleClaim == null)
                                    {
                                        inputHistory.UserRoleClaim = inputRoleClaim;
                                    }

                                    _dbContext.Entry(inputHistory).State = EntityState.Added;
                                }

                                user.RoleClaims.Add(inputRoleClaim);
                                _dbContext.Entry(inputRoleClaim).State = EntityState.Added;
                            }
                        }

                        // save changes
                        if (_dbContext.HasUnsavedChanges())
                        {
                            _dbContext.Users.Update(user);
                            _dbContext.SaveChanges();
                            dbContextTransaction.Commit();
                        }
                    }

                    return(Ok());
                }
                catch (Exception exception)
                {
                    dbContextTransaction.Rollback();
                    _logger.Exception(exception);
                    return(BadRequest(exception));
                }
            }
        }