VAspNetCoreSession.cs 2.4 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697
  1. using Microsoft.AspNetCore.Http;
  2. using System;
  3. using VCommon.Ioc;
  4. using VCommon.VApplication;
  5. using VCommon.VApplication.DataStore;
  6. namespace VCommon.VOpenApi.VAspNetCore
  7. {
  8. public class VAspNetCoreSession : IVSession, ISingletonIocClass
  9. {
  10. private const string AuthorizationHeader = "Authorization";
  11. private const string TokenHeaderPart = "Token";
  12. private readonly HttpContext _context;
  13. private readonly IUserStore _store;
  14. private bool _isTokenChecked;
  15. private Guid? _tenantId;
  16. private Guid? _userId;
  17. private string _token;
  18. internal VAspNetCoreSession(HttpContext context, IUserStore store)
  19. {
  20. _context = context;
  21. _store = store;
  22. }
  23. private void EnsureTokenCheck()
  24. {
  25. if (_isTokenChecked) return;
  26. string token = null;
  27. //从请求头获取 Token
  28. string rawToken;
  29. if (false == string.IsNullOrWhiteSpace(rawToken = _context.Request.Headers[AuthorizationHeader]))
  30. {
  31. var parts = rawToken.Split(' ');
  32. if (parts.Length == 2 && parts[0] == TokenHeaderPart && false == string.IsNullOrWhiteSpace(parts[1]))
  33. {
  34. token = parts[1];
  35. }
  36. }
  37. //验证Token
  38. if (null != token)
  39. {
  40. _store.ValidateToken(token, out _tenantId, out var uid);
  41. _userId = uid;
  42. _token = token;
  43. }
  44. _isTokenChecked = true;
  45. }
  46. public Guid? UserId
  47. {
  48. get
  49. {
  50. EnsureTokenCheck();
  51. return _userId;
  52. }
  53. }
  54. public Guid? TenantId
  55. {
  56. get
  57. {
  58. EnsureTokenCheck();
  59. return _tenantId;
  60. }
  61. }
  62. public string Token
  63. {
  64. get
  65. {
  66. EnsureTokenCheck();
  67. return _token;
  68. }
  69. }
  70. public void DemandAuth()
  71. {
  72. EnsureTokenCheck();
  73. if (false == UserId.HasValue) throw new VApplicationAuthException("需要验证身份", AuthReason.AuthRequired);
  74. }
  75. public void Refresh()
  76. {
  77. _isTokenChecked = false;
  78. EnsureTokenCheck();
  79. }
  80. }
  81. }