using System.Collections.Specialized;
using System.Security.Cryptography;
using System.Collections.Generic;
public static void Main()
DateTime MyDate = DateTime.Now;
Console.WriteLine(DateTime.Now);
Console.WriteLine(DateTime.UtcNow);
Console.WriteLine(MyDate.ToUniversalTime());
DateTime utc = new DateTime(2014, 6, 4, 12, 34, 0);
TimeZoneInfo tzi = TimeZoneInfo.FindSystemTimeZoneById("Pacific Standard Time");
DateTime pacific = TimeZoneInfo.ConvertTimeFromUtc(utc, tzi);
Console.WriteLine(pacific);
Console.WriteLine(utc.ToUniversalTime());
Console.WriteLine(pacific.ToUniversalTime());
string TokenValue = HttpUtility.UrlDecode(Tokens.CreateToken(Type: "sso", UserName: "salplem", FirstName: "Sally", LastName: "Testing", CryptographyKey: "mykey"));
Console.WriteLine("CreateToken");
Console.WriteLine(TokenValue);
Model.Token TokenObj = Tokens.GetToken(Value: TokenValue, CryptographyKey: "mykey");
Console.WriteLine("GetToken");
Console.WriteLine(TokenObj.Serialize());
public static class Model
FirstName = string.Empty;
DateCreated = DateTime.MinValue.ToUniversalTime();
DateExpired = DateTime.MinValue.ToUniversalTime();
public DateTime DateCreated
public DateTime DateExpired
public double ElapsedSeconds
return ((TimeSpan)(DateTime.UtcNow - DateCreated)).TotalSeconds;
public double ElapsedMinutes
return ((TimeSpan)(DateTime.UtcNow - DateCreated)).TotalMinutes;
public double ElapsedHours
return ((TimeSpan)(DateTime.UtcNow - DateCreated)).TotalHours;
return Type.HasValue() && UserName.HasValue() && !DateCreated.Equals(DateTime.MinValue);
return !DateExpired.Equals(DateTime.MinValue) && DateExpired <= DateTime.UtcNow;
public static class Extensions
public static bool IsBlank(this string Value)
ReturnValue = Value.Trim().Length == 0;
public static bool HasValue(this string Value)
public static bool IsEqual(this string Value, string CompareValue)
bool ReturnValue = false;
if (Value != null && CompareValue != null)
ReturnValue = string.Compare(Value.Trim(), CompareValue.Trim(), StringComparison.OrdinalIgnoreCase) == 0;
public static bool ContainsKey(this NameValueCollection @this, string key)
return @this.Get(key) != null || @this.Keys.Cast<string>().Contains(key, StringComparer.OrdinalIgnoreCase);
public static string Serialize<T>(this T obj)
return Newtonsoft.Json.JsonConvert.SerializeObject(obj, Newtonsoft.Json.Formatting.Indented);
public static T Deserialize<T>(string data)where T : new ()
return Newtonsoft.Json.JsonConvert.DeserializeObject<T>(data);
public static class Tokens
public static Model.Token GetToken(string Value, string CryptographyKey)
Model.Token Token = new Model.Token();
NameValueCollection QueryString = new NameValueCollection();
string TokenValue = Value.HasValue() ? Value : string.Empty;
if (TokenValue.IsBlank())
QueryString = HttpUtility.ParseQueryString(new Cryptography(CryptographyKey: CryptographyKey).Decrypt(TokenValue));
QueryString = new NameValueCollection();
if (QueryString.HasKeys())
if (QueryString.ContainsKey("Type"))
Token.Type = QueryString["Type"];
if (QueryString.ContainsKey("UserName"))
Token.UserName = QueryString["UserName"];
if (QueryString.ContainsKey("Password"))
Token.Password = QueryString["Password"];
if (QueryString.ContainsKey("FirstName"))
Token.FirstName = QueryString["FirstName"];
if (QueryString.ContainsKey("LastName"))
Token.LastName = QueryString["LastName"];
if (QueryString.ContainsKey("Redirect"))
Token.Redirect = QueryString["Redirect"];
if (QueryString.ContainsKey("DateCreated"))
DateTime DateCreated = DateTime.MinValue;
DateTime.TryParse(QueryString["DateCreated"], out DateCreated);
Token.DateCreated = DateCreated;
if (QueryString.ContainsKey("DateExpired"))
DateTime DateExpired = DateTime.MinValue;
DateTime.TryParse(QueryString["DateExpired"], out DateExpired);
Token.DateExpired = DateExpired;
public static string CreateToken(string Type, string UserName, string FirstName = "", string LastName = "", DateTime? DateExpired = null, string Redirect = "", string CryptographyKey = "", string Password = "")
NameValueCollection QueryString = new NameValueCollection();
QueryString.Add("Type", Type);
QueryString.Add("UserName", UserName);
QueryString.Add("Password", Password);
if (FirstName.HasValue())
QueryString.Add("FirstName", FirstName);
QueryString.Add("LastName", LastName);
QueryString.Add("DateCreated", DateTime.UtcNow.ToString());
if (DateExpired.HasValue)
QueryString.Add("DateExpired", DateExpired.Value.ToUniversalTime().ToString());
QueryString.Add("Redirect", Redirect);
string q = ConstructQueryString(QueryString);
q = new Cryptography(CryptographyKey: CryptographyKey).Encrypt(q);
q = HttpUtility.UrlEncode(q);
public static string ConstructQueryString(NameValueCollection parameters)
List<string> items = new List<string>();
foreach (string name in parameters)
items.Add(string.Concat(name, "=", parameters[name]));
return string.Join("&", items.ToArray());
public class Cryptography
public string CryptographyKey
public Cryptography(string CryptographyKey)
this.CryptographyKey = CryptographyKey;
private enum CryptographyMode
public string Encrypt(string PlainText)
return EncryptDecrypt(PlainText, CryptographyMode.Encrypt);
public string Decrypt(string EncryptedText)
return EncryptDecrypt(EncryptedText, CryptographyMode.Decrypt);
private string EncryptDecrypt(string Text, CryptographyMode Mode)
byte[] BytesArray = null;
case CryptographyMode.Encrypt:
BytesArray = System.Text.Encoding.Unicode.GetBytes(Text);
case CryptographyMode.Decrypt:
BytesArray = Convert.FromBase64String(Text);
pdb = new PasswordDeriveBytes(CryptographyKey, new byte[]{0x49, 0x76, 0x61, 0x6e, 0x20, 0x4d, 0x65, 0x64, 0x76, 0x65, 0x64, 0x65, 0x76});
byte[] Key = pdb.GetBytes(32);
byte[] IV = pdb.GetBytes(32);
Rijndael alg = Rijndael.Create();
alg.Mode = CipherMode.CBC;
alg.Padding = PaddingMode.PKCS7;
MemoryStream ms = new MemoryStream();
case CryptographyMode.Encrypt:
cs = new CryptoStream(ms, alg.CreateEncryptor(), CryptoStreamMode.Write);
case CryptographyMode.Decrypt:
cs = new CryptoStream(ms, alg.CreateDecryptor(), CryptoStreamMode.Write);
cs.Write(BytesArray, 0, BytesArray.Length);
byte[] ResultingData = ms.ToArray();
case CryptographyMode.Encrypt:
ReturnValue = Convert.ToBase64String(ResultingData);
case CryptographyMode.Decrypt:
ReturnValue = System.Text.Encoding.Unicode.GetString(ResultingData);