88 lines
2.9 KiB
C#
88 lines
2.9 KiB
C#
// 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<string, string> Claims { get; set; }
|
|
|
|
[JsonIgnore]
|
|
public IEnumerable<RecordIdentifier> UserRoles { get; set; }
|
|
|
|
[JsonIgnore]
|
|
public IEnumerable<RecordIdentifier> 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<string, string> claims, IEnumerable<RecordIdentifier> userRoles, IEnumerable<RecordIdentifier> 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<Token>(tokenString);
|
|
return token;
|
|
}
|
|
|
|
private static bool ValidateTokenRaw(string tokenRaw)
|
|
{
|
|
if (string.IsNullOrWhiteSpace(tokenRaw))
|
|
return false;
|
|
|
|
if (!DataValidationHelper.StringIsBase64(tokenRaw))
|
|
return false;
|
|
|
|
return true;
|
|
}
|
|
}
|
|
}
|