diff options
Diffstat (limited to 'Software/Visual_Studio/Tango.Web')
| -rw-r--r-- | Software/Visual_Studio/Tango.Web/Authentication/TokensManager.cs | 66 |
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); + } + } } } } |
