FlexitimeTracker/FlexitimeUI/FlexitimeAPI/Services/UserService.cs
Chris Watts 005da7ce2b create initial react project for flexitime v2 application.
includes .net webapi backend and ui test stubs
2021-03-22 14:54:42 +00:00

124 lines
4.0 KiB
C#

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<User> 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<User> _users;
private readonly AppSettings _appSettings;
public UserService(IOptions<AppSettings> 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<User> 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<Claim> claims = new List<Claim>()
{
};
//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);
}
}
}