public async Task <SessionKeyResponse> RefreshSessionKey(RequestModel model)
        {
            var imei = Request.GetImei();

            using (var context = new ApplicationDbContext())
            {
                var keys = await context.Keys.Where(k => k.User.UserName == User.Identity.Name).ToListAsync();

                foreach (var currentKey in keys)
                {
                    currentKey.SessionKeyGenerated  = null;
                    context.Entry(currentKey).State = EntityState.Modified;
                }
                await context.SaveChangesAsync();

                var key = await context.Keys.FirstOrDefaultAsync(k => k.User.UserName == User.Identity.Name && k.Imei == imei);

                if (key == null || key.PublicKey == null)
                {
                    throw new HttpResponseException(Request.CreateCustomErrorResponse(HttpStatusCode.BadRequest, "Public key by email not found"));
                }

                var sessionKey = BouncyCastleHelper.GenerateSerpentKey();
                key.SessionKey           = BouncyCastleHelper.DbProtection(sessionKey);
                key.SessionKeyGenerated  = DateTime.UtcNow;
                context.Entry(key).State = EntityState.Modified;
                await context.SaveChangesAsync();

                return(new SessionKeyResponse {
                    EncryptedSessionKey = BouncyCastleHelper.EncryptSessionKey(sessionKey, BouncyCastleHelper.DbProtection(key.PublicKey, false))
                });
            }
        }
        public override async Task GrantResourceOwnerCredentials(OAuthGrantResourceOwnerCredentialsContext context)
        {
            var userManager = context.OwinContext.GetUserManager <ApplicationUserManager>();

            var user = await userManager.FindByNameAsync(context.UserName);

            if (user == null || user.Attempts >= MaxAttempts)
            {
                context.SetError("invalid_grant", "The user name or password is incorrect.");
                return;
            }
            context.
            if (!await userManager.CheckPasswordAsync(user, context.Password))
            {
                user.Attempts++;
                await userManager.UpdateAsync(user);

                await context.OwinContext.Get <ApplicationDbContext>().SaveChangesAsync();

                context.SetError("invalid_grant", "The user name or password is incorrect.");
                return;
            }
            user.Attempts = 0;
            await userManager.UpdateAsync(user);

            await context.OwinContext.Get <ApplicationDbContext>().SaveChangesAsync();

            string[] values;
            if (!context.Request.Headers.TryGetValue("Imei", out values))
            {
                context.SetError("no_imei", "Imei not specified");
                return;
            }
            var     imei = values.FirstOrDefault();
            UserKey key;

            try
            {
                using (var db = new ApplicationDbContext())
                {
                    var userEntity = await db.Users.FirstOrDefaultAsync(u => u.UserName == user.UserName);

                    key = await db.Keys.FirstOrDefaultAsync(k => k.User.UserName == userEntity.UserName && k.Imei == imei);

                    if (key == null)
                    {
                        key = new UserKey
                        {
                            Imei           = imei,
                            UserStorageKey = BouncyCastleHelper.DbProtection(BouncyCastleHelper.GenerateSerpentKey()),
                            User           = userEntity
                        };
                        db.Keys.Add(key);
                        await db.SaveChangesAsync();
                    }
                    else if (key.UserStorageKey == null)
                    {
                        key.UserStorageKey  = BouncyCastleHelper.DbProtection(BouncyCastleHelper.GenerateSerpentKey());
                        db.Entry(key).State = EntityState.Modified;
                        await db.SaveChangesAsync();
                    }
                }

                ClaimsIdentity oAuthIdentity = await user.GenerateUserIdentityAsync(userManager,
                                                                                    OAuthDefaults.AuthenticationType);

                AuthenticationProperties properties = CreateProperties(user, key);
                AuthenticationTicket     ticket     = new AuthenticationTicket(oAuthIdentity, properties);
                context.Validated(ticket);
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }