// POST: /User/Login
        public async Task <IActionResult> Login([FromBody] LoginModel model)
        {
            // This doesn't count login failures towards account lockout
            // To enable password failures to trigger account lockout, set lockoutOnFailure: true
            var result = await _signInManager.PasswordSignInAsync(model.UserName, model.Password, model.RememberMe, lockoutOnFailure : false);

            if (result.Succeeded)
            {
                var request = new GenerateJWTRequest
                {
                    UserName = model.UserName
                };

                var authenticatedModel = _tokenService.GenerateJWT(request);
                return(Ok(authenticatedModel));
            }
            else
            {
                return(Unauthorized());
            }
        }
Пример #2
0
        public GenerateJWTResponse GenerateJWT(GenerateJWTRequest request)
        {
            var response = new GenerateJWTResponse
            {
                IsSuccessful       = false,
                Message            = "",
                AuthenticatedModel = new AuthenticatedModel()
            };

            try
            {
                var user = _context.ApplicationUsers
                           .Include(u => u.Customer)
                           .FirstOrDefault(u => u.UserName == request.UserName);

                // Security key (Consider moving the key to a different place).
                string securityKey = "this_is_our_super_long_security_key_for_token_validation_project_2018_09_07$smesk.in";

                // Symmetric security key.
                var symmetricSecurityKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(securityKey));

                // Signing credentials.
                var signingCredentials = new SigningCredentials(symmetricSecurityKey, "HS256");
                var secret             = signingCredentials.Key.ToString();

                // Add claims.
                var claims = new List <Claim>();

                // Claims.Add(new Claim(ClaimTypes.Role, "Administrator"));
                claims.Add(new Claim(ClaimTypes.Role, "User"));
                claims.Add(new Claim("FirstName", user.Customer.FirstName));
                claims.Add(new Claim("LastName", user.Customer.LastName));
                claims.Add(new Claim("Username", user.UserName));
                claims.Add(new Claim("EmailAddress", user.Customer.Email));
                claims.Add(new Claim("Birthday", user.Customer.DateOfBirth.ToString()));
                claims.Add(new Claim("PhoneNumber", user.Customer.PhoneNumber.ToString()));

                // Create access token.
                var accessToken = new JwtSecurityToken(
                    issuer: "smesk.in",
                    audience: "readers",
                    expires: DateTime.Now.AddMinutes(320),
                    signingCredentials: signingCredentials,
                    claims: claims
                    );

                // Create refresh token.
                var refreshToken = new JwtSecurityToken(
                    issuer: "smesk.in",
                    audience: "readers",
                    expires: DateTime.Now.AddDays(2),
                    signingCredentials: signingCredentials,
                    claims: claims
                    );

                response.AuthenticatedModel.AccessToken  = new JwtSecurityTokenHandler().WriteToken(accessToken);
                response.AuthenticatedModel.RefreshToken = new JwtSecurityTokenHandler().WriteToken(refreshToken);
                response.AuthenticatedModel.Customer     = user.Customer;
                response.Username = user.UserName;

                response.IsSuccessful = true;
                response.Message      = "Successfully added JWT and associated information.";
            }
            catch (Exception ex)
            {
                response.Message = ex.ToString();
            }

            // return the authenticated model.
            return(response);
        }
        // POST: /User/Register
        public async Task <Object> PostApplicationUser([FromBody] ApplicationUserModel model)
        {
            // Query on the customer.
            var customer = _context.Customers
                           .Where(x => x.Id == model.CustomerId)
                           .FirstOrDefault();

            if (customer != null)
            {
                // Need code here to check if the incoming customer already has an account.
                // If they do not - proceed with logic and allow the user account to be created.
                // Otherwise through them out/reject with a status 400 error and a message for the reason.
                var users = _userManager
                            .Users
                            .Include(x => x.Customer)
                            .ToList();

                var foundAssociatedUserProfile = users
                                                 .Where(x => x.Customer.Id == model.CustomerId)
                                                 .ToList();

                // If == 0, this customer doesn't have an established user profile/account.
                if (foundAssociatedUserProfile.Count == 0)
                {
                    var applicationUser = new ApplicationUser
                    {
                        Customer    = customer,
                        UserName    = model.UserName,
                        Email       = customer.Email,
                        PhoneNumber = customer.PhoneNumber
                    };

                    try
                    {
                        if (model.Password == model.ConfirmPassword)
                        {
                            var result = await _userManager.CreateAsync(applicationUser, model.Password);

                            if (result.Succeeded)
                            {
                                var request = new GenerateJWTRequest
                                {
                                    UserName = model.UserName
                                };

                                var authenticatedModel = _tokenService.GenerateJWT(request);
                                return(Ok(authenticatedModel));
                            }
                        }
                    }
                    catch (Exception ex)
                    {
                        return(BadRequest(ex.ToString()));
                    }
                }
                else
                {
                    return(BadRequest($"Could not create user account. Because a duplicate user account would be created for this customer with ID: {model.CustomerId}."));
                }
            }

            return(NoContent());
        }