// 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()); } }
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()); }