aboutsummaryrefslogtreecommitdiffstats
path: root/Software/Visual_Studio/Tango.Web
diff options
context:
space:
mode:
Diffstat (limited to 'Software/Visual_Studio/Tango.Web')
-rw-r--r--Software/Visual_Studio/Tango.Web/Authentication/TokensManager.cs66
1 files changed, 58 insertions, 8 deletions
diff --git a/Software/Visual_Studio/Tango.Web/Authentication/TokensManager.cs b/Software/Visual_Studio/Tango.Web/Authentication/TokensManager.cs
index 701a87a3c..8e0eb4288 100644
--- a/Software/Visual_Studio/Tango.Web/Authentication/TokensManager.cs
+++ b/Software/Visual_Studio/Tango.Web/Authentication/TokensManager.cs
@@ -7,35 +7,85 @@ using System.Threading.Tasks;
namespace Tango.Web.Authentication
{
- public class TokensManager<T>
+ public class TokensManager<T> where T : IEquatable<T>
{
- private Dictionary<String, T> _tokens;
+ private Dictionary<String, TokenWrapper> _tokens;
+
+ private class TokenWrapper : IEquatable<TokenWrapper>
+ {
+ public DateTime Date { get; set; }
+
+ public T Value { get; set; }
+
+ public bool Equals(TokenWrapper other)
+ {
+ return Value.Equals(other.Value);
+ }
+ }
public TokensManager()
{
- _tokens = new Dictionary<String, T>();
+ _tokens = new Dictionary<string, TokenWrapper>();
+ ExpirationTime = TimeSpan.FromHours(1);
}
- public String CreateNew(T userID)
+ public TimeSpan ExpirationTime { get; set; }
+
+ public String GetOrCreate(T tokenObject)
{
- String token = Guid.NewGuid().ToString();
- _tokens.Add(token, userID);
- return token;
+ var existing_token = _tokens.FirstOrDefault(x => x.Value.Value.Equals(tokenObject));
+
+ if (existing_token.Key != null)
+ {
+ return existing_token.Key;
+ }
+ else
+ {
+ String token = Guid.NewGuid().ToString();
+ _tokens.Add(token, new TokenWrapper()
+ {
+ Value = tokenObject,
+ Date = DateTime.Now,
+ });
+ return token;
+ }
}
public bool Exists(String token)
{
+ RemoveOrRenewExpired(token);
+
return _tokens.ContainsKey(token);
}
public T GetTokenObject(String token)
{
+ RemoveOrRenewExpired(token);
+
if (!_tokens.ContainsKey(token))
{
throw new AuthenticationException("Invalid token.");
}
- return _tokens[token];
+ return _tokens[token].Value;
+ }
+
+ private void RemoveOrRenewExpired(String token)
+ {
+ DateTime now = DateTime.Now;
+
+ if (_tokens.ContainsKey(token))
+ {
+ _tokens[token].Date = now;
+ }
+
+ foreach (var t in _tokens.ToList())
+ {
+ if (now > t.Value.Date.Add(ExpirationTime))
+ {
+ _tokens.Remove(t.Key);
+ }
+ }
}
}
}