PageRenderTime 35ms CodeModel.GetById 11ms RepoModel.GetById 0ms app.codeStats 0ms

/Raven.Database/Server/Security/OAuth/AccessToken.cs

https://github.com/barryhagan/ravendb
C# | 107 lines | 88 code | 19 blank | 0 comment | 4 complexity | 9717ae0af8dd951f115b5ab6cb477442 MD5 | raw file
Possible License(s): MPL-2.0-no-copyleft-exception, BSD-3-Clause, CC-BY-SA-3.0
  1. using System;
  2. using System.Security.Cryptography;
  3. using System.Security.Cryptography.X509Certificates;
  4. using System.Text;
  5. using Raven.Abstractions.Data;
  6. using Raven.Imports.Newtonsoft.Json;
  7. using Raven.Abstractions;
  8. using Raven.Json.Linq;
  9. using System.Linq;
  10. using Raven.Abstractions.Extensions;
  11. namespace Raven.Database.Server.Security.OAuth
  12. {
  13. using Raven.Abstractions.Util.Encryptors;
  14. public class AccessToken
  15. {
  16. public string Body { get; set; }
  17. public string Signature { get; set; }
  18. private bool MatchesSignature(byte[] key)
  19. {
  20. var signatureData = Convert.FromBase64String(Signature);
  21. using (var rsa = Encryptor.Current.CreateAsymmetrical())
  22. {
  23. rsa.ImportCspBlob(key);
  24. var bodyData = Encoding.Unicode.GetBytes(Body);
  25. return rsa.VerifyHash(Encryptor.Current.Hash.ComputeForOAuth(bodyData), CryptoConfig.MapNameToOID("SHA1"), signatureData);
  26. }
  27. }
  28. public static bool TryParseBody(byte[] key, string token, out AccessTokenBody body)
  29. {
  30. AccessToken accessToken;
  31. if (TryParse(token, out accessToken) == false)
  32. {
  33. body = null;
  34. return false;
  35. }
  36. if (accessToken.MatchesSignature(key) == false)
  37. {
  38. body = null;
  39. return false;
  40. }
  41. try
  42. {
  43. body = JsonConvert.DeserializeObject<AccessTokenBody>(accessToken.Body);
  44. return true;
  45. }
  46. catch
  47. {
  48. body = null;
  49. return false;
  50. }
  51. }
  52. private static bool TryParse(string token, out AccessToken accessToken)
  53. {
  54. try
  55. {
  56. accessToken = JsonConvert.DeserializeObject<AccessToken>(token);
  57. return true;
  58. }
  59. catch
  60. {
  61. accessToken = null;
  62. return false;
  63. }
  64. }
  65. public static AccessToken Create(byte[] key, AccessTokenBody tokenBody)
  66. {
  67. tokenBody.Issued = (SystemTime.UtcNow - DateTime.MinValue).TotalMilliseconds;
  68. var body = RavenJObject.FromObject(tokenBody)
  69. .ToString(Formatting.None);
  70. var signature = Sign(body, key);
  71. return new AccessToken { Body = body, Signature = signature };
  72. }
  73. public static string Sign(string body, byte[] key)
  74. {
  75. var data = Encoding.Unicode.GetBytes(body);
  76. using (var rsa = Encryptor.Current.CreateAsymmetrical())
  77. {
  78. var hash = Encryptor.Current.Hash.ComputeForOAuth(data);
  79. rsa.ImportCspBlob(key);
  80. return Convert.ToBase64String(rsa.SignHash(hash, CryptoConfig.MapNameToOID("SHA1")));
  81. }
  82. }
  83. public string Serialize()
  84. {
  85. return RavenJObject.FromObject(this).ToString(Formatting.None);
  86. }
  87. }
  88. }