using AutoMapper; using IdentityServer.Domain.Entities; using IdentityServer.Domain.Models; using Newtonsoft.Json; using System; using System.Text; using System.Text.RegularExpressions; namespace IdentityServer.Application.Services { internal class TokenService : ITokenService { private readonly IMapper _mapper; public TokenService(IMapper mapper) { _mapper = mapper; } public string GenerateTokenRaw(AppUser user) { var tokenCore = GenerateToken(user); var tokenCoreString = JsonConvert.SerializeObject(tokenCore); var tokenCoreBytes = Encoding.UTF8.GetBytes(tokenCoreString); var tokenRaw = Convert.ToBase64String(tokenCoreBytes); return tokenRaw; } private TokenCore GenerateToken(AppUser user) { var tokenCore = _mapper.Map(user); tokenCore.LockStamp = Regex.Replace(Convert.ToBase64String(Guid.NewGuid().ToByteArray()), "[/+=]", ""); return tokenCore; } public TokenCore ExtractTokenCore(string tokenRaw) { var valid = ValidateTokenRaw(tokenRaw); if (!valid) return null; var tokenCoreBytes = Convert.FromBase64String(tokenRaw); var tokenCoreString = Encoding.UTF8.GetString(tokenCoreBytes); var tokenCore = JsonConvert.DeserializeObject(tokenCoreString); return tokenCore; } private bool ValidateTokenRaw(string tokenRaw) { if (string.IsNullOrWhiteSpace(tokenRaw)) return false; if (!StringIsBase64(tokenRaw)) return false; return true; } private bool StringIsBase64(string str) { str = str.Trim(); return (str.Length % 4 == 0) && Regex.IsMatch(str, @"^[a-zA-Z0-9+/]*={0,3}$", RegexOptions.None); } } }