124 lines
4.0 KiB
C#
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);
|
|
}
|
|
}
|
|
}
|