Ejemplo n.º 1
0
        public string GenerateToken(FoodsIdentityUser user)
        {
            var claims = new List <Claim>
            {
                new Claim(JwtRegisteredClaimNames.Sub, user.Id),
                new Claim(JwtRegisteredClaimNames.Jti, Guid.NewGuid().ToString()),
                new Claim(ClaimTypes.NameIdentifier, user.Id),
                new Claim("uid", user.UserId),
                new Claim("cid", user.CookId)
            };

            var key     = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(_configuration["Jwt:JwtKey"]));
            var creds   = new SigningCredentials(key, SecurityAlgorithms.HmacSha256);
            var expires = DateTime.Now.AddDays(Convert.ToDouble(_configuration["Jwt:JwtExpireDays"]));

            var token = new JwtSecurityToken(
                _configuration["Jwt:JwtIssuer"],
                _configuration["Jwt:JwtIssuer"],
                claims,
                expires: expires,
                signingCredentials: creds
                );

            return(new JwtSecurityTokenHandler().WriteToken(token));
        }
Ejemplo n.º 2
0
        public async Task ValidateCurrentPasswordIsCorrect(FoodsIdentityUser user, string passwordToValidate)
        {
            var isCorrectPassword = await _userManager.CheckPasswordAsync(user, passwordToValidate);

            if (!isCorrectPassword)
            {
                throw new FoodsValidationException("CurrentPassword", "Obfuscated",
                                                   "Current password is incorrect");
            }
        }
Ejemplo n.º 3
0
        public async Task ChangePassword(FoodsIdentityUser user, string oldPassword, string newPassword)
        {
            var result = await _userManager.ChangePasswordAsync(user, oldPassword, newPassword);

            if (!result.Succeeded)
            {
                var errors = result.Errors.Select(error => new FoodsError
                {
                    PropertyName = "Username/Password",
                    ErrorMessage = error.Description
                })
                             .ToList();

                throw new FoodsValidationException(errors);
            }
        }
Ejemplo n.º 4
0
 public async Task SendResetPasswordSuccessEmail(FoodsIdentityUser user)
 {
     await _emailIntercom.Send(EmailTypes.AccountDetailsUpdated, new TransmissionPayload
     {
         Destinations = new List <TransmissionDestination>
         {
             new TransmissionDestination
             {
                 DestinationEmail = user.Email,
                 SubstitutionData = new Dictionary <string, object>
                 {
                     ["updatedAccountDetails"] = "Password changed."
                 }
             }
         }
     });
 }
Ejemplo n.º 5
0
        public async Task ChangeEmail(FoodsIdentityUser user, string newEmail)
        {
            ValidateEmailNotAlreadyInUse(newEmail);

            user.PreviousEmail  = user.Email;
            user.EmailConfirmed = false;

            await _userManager.SetEmailAsync(user, newEmail);

            await _userManager.SetUserNameAsync(user, newEmail);

            await _userManager.UpdateAsync(user);

            //Invalidate links sent to other accounts
            await _userManager.UpdateSecurityStampAsync(user);

            await SendEmailConfirmation(user);
            await SendEmailChangedNotification(user.PreviousEmail);
        }
Ejemplo n.º 6
0
        public async Task SendEmailConfirmation(FoodsIdentityUser user)
        {
            var emailConfirmToken = await _userManager.GenerateEmailConfirmationTokenAsync(user);

            var generatedUrl = $"{_configuration["BaseAppUrl"]}/confirm-email?confirm_token={emailConfirmToken}&user_id={user.Id}";

            await _emailIntercom.Send(EmailTypes.EmailConfirmation, new TransmissionPayload
            {
                Destinations = new List <TransmissionDestination>
                {
                    new TransmissionDestination
                    {
                        DestinationEmail = user.Email,
                        SubstitutionData = new Dictionary <string, object>
                        {
                            ["confirmationUrl"] = generatedUrl
                        }
                    }
                },
                Attachments = new List <Attachment>()
            });
        }
Ejemplo n.º 7
0
        public async Task <IActionResult> Register([FromBody] RegisterDto registerDto)
        {
            async Task SaveUser(FoodsIdentityUser user)
            {
                var foodsUser = await _userRepository.Save(new User
                {
                    Id = Guid.NewGuid().ToString(),
                    IdentityProviderId = user.Id,
                    Email = user.Email
                });

                user.UserId = foodsUser.Id;
            }

            async Task SaveCook(FoodsIdentityUser user)
            {
                var foodsCook = await _cookRepository.Save(new Cook
                {
                    Id = Guid.NewGuid().ToString()
                });

                user.CookId = foodsCook.Id;
            }

            async Task <string> Register()
            {
                await _registerValidator.ValidateEntityAsync(registerDto);

                var user = new FoodsIdentityUser
                {
                    UserName = registerDto.Email,
                    Email    = registerDto.Email
                };

                var result = await _userManager.CreateAsync(user, registerDto.Password);

                if (result.Succeeded)
                {
                    await _signInManager.SignInAsync(user, false);
                    await SaveUser(user);
                    await SaveCook(user);

                    await _userManager.UpdateAsync(user);

                    await _accountHelper.SendEmailConfirmation(user);

                    var jwtToken = _jwtHelper.GenerateToken(user);

                    return(jwtToken);
                }

                var errors = result.Errors.Select(error => new FoodsError
                {
                    PropertyName = "Username/Password",
                    ErrorMessage = error.Description
                })
                             .ToList();

                throw new FoodsValidationException(errors);
            }

            return(await Execute(Register));
        }