// Copyright (c) 2020 Tudor Stanciu using Newtonsoft.Json; using System; using System.Collections.Generic; using System.Text; using System.Text.RegularExpressions; using Tuitio.Domain.Helpers; namespace Tuitio.Domain.Models { public class Token { public Guid TokenId { get; set; } public int UserId { get; set; } public string UserName { get; set; } public string FirstName { get; set; } public string LastName { get; set; } public string Email { get; set; } public string SecurityStamp { get; set; } public string LockStamp { get; set; } public DateTime CreatedAt { get; set; } public long ExpiresIn { get; set; } public Dictionary Claims { get; set; } [JsonIgnore] public IEnumerable UserRoles { get; set; } [JsonIgnore] public IEnumerable UserGroups { get; set; } [Obsolete("This constructor is only used for deserialization and should not be used for any other purpose.")] public Token() { } public Token(int validityInMinutes) { TokenId = Guid.NewGuid(); CreatedAt = DateTime.UtcNow; LockStamp = Regex.Replace(Convert.ToBase64String(Guid.NewGuid().ToByteArray()), "[/+=]", ""); ExpiresIn = validityInMinutes * 60; // seconds } public void SetUserData(int userId, string userName, string firstName, string lastName, string email, string securityStamp, Dictionary claims, IEnumerable userRoles, IEnumerable userGroups) { UserId = userId; UserName = userName; FirstName = firstName; LastName = lastName; Email = email; SecurityStamp = securityStamp; Claims = claims; UserRoles = userRoles; UserGroups = userGroups; } public string Export() { var tokenString = JsonConvert.SerializeObject(this); var tokenBytes = Encoding.UTF8.GetBytes(tokenString); var tokenRaw = Convert.ToBase64String(tokenBytes); return tokenRaw; } public static Token Import(string tokenRaw) { var valid = ValidateTokenRaw(tokenRaw); if (!valid) return null; var tokenBytes = Convert.FromBase64String(tokenRaw); var tokenString = Encoding.UTF8.GetString(tokenBytes); var token = JsonConvert.DeserializeObject(tokenString); return token; } private static bool ValidateTokenRaw(string tokenRaw) { if (string.IsNullOrWhiteSpace(tokenRaw)) return false; if (!DataValidationHelper.StringIsBase64(tokenRaw)) return false; return true; } } }