using System; using System.Collections.Generic; using System.IdentityModel.Tokens.Jwt; using System.Linq; using System.Security.Claims; using System.Text; using Flexitime.Objects; using FlexitimeAPI.Models; using Microsoft.Extensions.Options; using Microsoft.IdentityModel.Tokens; using RandomNameGeneratorLibrary; namespace FlexitimeAPI.Services { public interface IUserService { LoginResponse Authenticate(LoginRequest model); IEnumerable GetAll(); User GetById(int id); } public class UserService : IUserService { private PersonNameGenerator _personGenerator; // users hardcoded for simplicity, store in a db with hashed passwords in production applications private List _users; private readonly AppSettings _appSettings; public UserService(IOptions appSettings) { _appSettings = appSettings.Value; _personGenerator = new PersonNameGenerator(); var random = new Random(); var vals = Enum.GetValues(typeof(UserState)); _users = Enumerable.Range(2, 6).Select(index => { var first = _personGenerator.GenerateRandomFirstName(); var last = _personGenerator.GenerateRandomLastName(); return new User { UserId = index, LoginId = $"{first}{last}", Password = "12345", FirstName = first, LastName = last, HoursPerWeek = 37, IsContractor = false, State = (UserState)vals.GetValue(random.Next(2, vals.Length)) }; }).ToList(); //create default known admin user.. _users.Add(new User { UserId = 1, LoginId = "admin", Password = "P@ssw0rd!", FirstName = "Admin", LastName = "User", HoursPerWeek = 37, IsContractor = false, State = UserState.In }); } public LoginResponse Authenticate(LoginRequest model) { var user = _users.SingleOrDefault(x => x.LoginId == model.Username && x.Password == model.Password); // return null if user not found if (user == null) return null; // authentication successful so generate jwt token var token = GenerateJwtToken(user); return new LoginResponse(user, token); } public IEnumerable GetAll() { return _users; } public User GetById(int id) { return _users.FirstOrDefault(x => x.UserId == id); } // helper methods private string GenerateJwtToken(User user) { // generate token that is valid for 7 days var tokenHandler = new JwtSecurityTokenHandler(); var key = Encoding.ASCII.GetBytes(_appSettings.Secret); List claims = new List() { }; //var jwt = new JwtSecurityToken(issuer:"FlexitimeUI",claims:claims); var tokenDescriptor = new SecurityTokenDescriptor { Subject = new ClaimsIdentity(new[] { new Claim("id", user.UserId.ToString()) }), Expires = DateTime.UtcNow.AddHours(2), Issuer = "FlexitimeUI", NotBefore = DateTime.UtcNow.AddSeconds(-5), IssuedAt = DateTime.UtcNow, //Claims = claims, SigningCredentials = new SigningCredentials(new SymmetricSecurityKey(key), SecurityAlgorithms.HmacSha256Signature) }; var token = tokenHandler.CreateToken(tokenDescriptor); //tokenHandler. return tokenHandler.WriteToken(token); } } }