aboutsummaryrefslogtreecommitdiffstats
path: root/Software/Visual_Studio/Web/Tango.MachineService.Gateway/WebToken.cs
diff options
context:
space:
mode:
authorRoy Ben-Shabat <Roy@Twine-s.com>2020-02-12 16:44:17 +0200
committerRoy Ben-Shabat <Roy@Twine-s.com>2020-02-12 16:44:17 +0200
commit18477c8dc7e7971f2cfb08d0e11ca483944f79f2 (patch)
tree22a7c735184c5df6a84d2182d3ff9b2222cc53b5 /Software/Visual_Studio/Web/Tango.MachineService.Gateway/WebToken.cs
parent48ceaabee98371376e606361f396a61c479ce031 (diff)
downloadTango-18477c8dc7e7971f2cfb08d0e11ca483944f79f2.tar.gz
Tango-18477c8dc7e7971f2cfb08d0e11ca483944f79f2.zip
Added project Tango.MachineService.Gateway
Diffstat (limited to 'Software/Visual_Studio/Web/Tango.MachineService.Gateway/WebToken.cs')
-rw-r--r--Software/Visual_Studio/Web/Tango.MachineService.Gateway/WebToken.cs192
1 files changed, 192 insertions, 0 deletions
diff --git a/Software/Visual_Studio/Web/Tango.MachineService.Gateway/WebToken.cs b/Software/Visual_Studio/Web/Tango.MachineService.Gateway/WebToken.cs
new file mode 100644
index 000000000..7aa4860ab
--- /dev/null
+++ b/Software/Visual_Studio/Web/Tango.MachineService.Gateway/WebToken.cs
@@ -0,0 +1,192 @@
+using JWT;
+using JWT.Algorithms;
+using JWT.Builder;
+using JWT.Serializers;
+using Newtonsoft.Json;
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Security.Claims;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace Tango.Web.Security
+{
+ public class WebToken
+ {
+ public DateTime Issued { get; protected set; }
+ public DateTime? Expiration { get; protected set; }
+ public String AccessToken { get; protected set; }
+ public String RefreshToken { get; protected set; }
+
+ public WebToken()
+ {
+
+ }
+
+ public static WebToken CreateNew(String secret, DateTime? expiration = null)
+ {
+ DateTime issued = DateTime.UtcNow;
+
+ var builder = new JwtBuilder()
+ .WithAlgorithm(new HMACSHA256Algorithm())
+ .WithSecret(secret)
+ .IssuedAt(issued);
+
+ if (expiration != null)
+ {
+ builder = builder.ExpirationTime(expiration.Value);
+ }
+
+ String refreshToken = Guid.NewGuid().ToString();
+
+ builder = builder.AddClaim("object", null);
+ builder = builder.AddClaim("refresh-token", refreshToken);
+
+ return new WebToken()
+ {
+ AccessToken = builder.Build(),
+ RefreshToken = refreshToken,
+ Expiration = expiration,
+ Issued = issued,
+ };
+ }
+
+ public static void Validate(String secret, String token)
+ {
+ var json = new JwtBuilder()
+ .WithSecret(secret)
+ .MustVerifySignature()
+ .Decode(token);
+ }
+
+ public void Validate(String secret)
+ {
+ var json = new JwtBuilder()
+ .WithSecret(secret)
+ .MustVerifySignature()
+ .Decode(AccessToken);
+ }
+
+ public WebToken Renew(String secret)
+ {
+ var newToken = CreateNew(secret, DateTime.UtcNow.Add(Expiration.Value - Issued));
+ newToken.RefreshToken = RefreshToken;
+ return newToken;
+ }
+
+ public static WebToken FromToken(String token)
+ {
+ WebToken webToken = new WebToken();
+
+ var payload = new JwtBuilder()
+ .WithValidator(null)
+ .Decode<IDictionary<string, object>>(token);
+
+ webToken.AccessToken = token;
+
+ if (payload.ContainsKey("exp"))
+ {
+ long exp = long.Parse(payload["exp"].ToString());
+ webToken.Expiration = ConvertEpochToDateTime(exp);
+ }
+
+ if (payload.ContainsKey("iat"))
+ {
+ long iat = long.Parse(payload["iat"].ToString());
+ webToken.Issued = ConvertEpochToDateTime(iat);
+ }
+
+ if (payload.ContainsKey("refresh-token"))
+ {
+ webToken.RefreshToken = payload["refresh-token"].ToString();
+ }
+
+ return webToken;
+ }
+
+ protected static DateTime ConvertEpochToDateTime(long seconds)
+ {
+ var epoch = new DateTime(1970, 1, 1, 0, 0, 0, DateTimeKind.Utc);
+ return epoch.AddSeconds(seconds);
+ }
+ }
+
+ public class WebToken<T> : WebToken where T : class
+ {
+ public T Object { get; protected set; }
+
+ private WebToken()
+ {
+
+ }
+
+ public static WebToken<T> CreateNew(String secret, T obj = null, DateTime? expiration = null)
+ {
+ DateTime issued = DateTime.UtcNow;
+
+ var builder = new JwtBuilder()
+ .WithAlgorithm(new HMACSHA256Algorithm())
+ .WithSecret(secret)
+ .IssuedAt(issued);
+
+ if (expiration != null)
+ {
+ builder = builder.ExpirationTime(expiration.Value);
+ }
+
+ String refreshToken = Guid.NewGuid().ToString();
+
+ builder = builder.AddClaim("object", obj);
+ builder = builder.AddClaim("refresh-token", refreshToken);
+
+ return new WebToken<T>()
+ {
+ AccessToken = builder.Build(),
+ RefreshToken = refreshToken,
+ Expiration = expiration,
+ Issued = issued,
+ Object = obj,
+ };
+ }
+
+ public static new WebToken<T> FromToken(String token)
+ {
+ WebToken<T> webToken = new WebToken<T>();
+
+ var payload = new JwtBuilder()
+ .WithValidator(null)
+ .Decode<IDictionary<string, object>>(token);
+
+ webToken.AccessToken = token;
+
+ if (payload.ContainsKey("exp"))
+ {
+ long exp = long.Parse(payload["exp"].ToString());
+ webToken.Expiration = ConvertEpochToDateTime(exp);
+ }
+
+ if (payload.ContainsKey("iat"))
+ {
+ long iat = long.Parse(payload["iat"].ToString());
+ webToken.Issued = ConvertEpochToDateTime(iat);
+ }
+
+ if (payload.ContainsKey("refresh-token"))
+ {
+ webToken.RefreshToken = payload["refresh-token"].ToString();
+ }
+
+ webToken.Object = JsonConvert.DeserializeObject<T>(payload["object"].ToString());
+
+ return webToken;
+ }
+
+ public new WebToken<T> Renew(String secret)
+ {
+ var newToken = WebToken<T>.CreateNew(secret, Object, DateTime.UtcNow.Add(Expiration.Value - Issued));
+ newToken.RefreshToken = RefreshToken;
+ return newToken;
+ }
+ }
+}