APIProvider.cs 3.2 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788
  1. using dodohold.core;
  2. using Microsoft.AspNetCore.Http;
  3. using Microsoft.AspNetCore.Mvc.Filters;
  4. namespace molilian.core
  5. {
  6. /// <summary>
  7. /// Authorization 授权
  8. /// </summary>
  9. public class APIProvider : IAuthorizationProvider
  10. {
  11. public string Domain => "api";
  12. private static string _consumerKey = "consumerkey";
  13. private static string _consumerSecret = "0512ef0d33f0f7d6";
  14. AccessTokenCore tokenCore = new AccessTokenCore();
  15. /// <summary>
  16. /// 验证是否未授权
  17. /// </summary>
  18. /// <param name="request">客户请求的token和scope(域)</param>
  19. /// <param name="logicAttr">受访问的权限属性</param>
  20. /// <returns></returns>
  21. public bool Verified(ActionExecutingContext context, (string ticket, string domain) request, MyAuthorizeAttribute logicAttr)
  22. {
  23. if (string.IsNullOrEmpty(request.ticket)) { return false; }
  24. if (!string.IsNullOrEmpty(logicAttr.Domain) && !logicAttr.Domain.Equals(request.domain)) { return false; }
  25. IAccessTokenDTO accessToken = Get(request.domain, request.ticket);
  26. if (accessToken == null) { return false; }
  27. if (accessToken.ExpiresIn == 0) { return true; }
  28. DateTime expiresTime = (accessToken.create_time + accessToken.ExpiresIn).Convert2Datetime();
  29. if (expiresTime > DateTime.Now) { return true; }
  30. return false;
  31. }
  32. public IAccessTokenDTO Get(HttpContext context)
  33. {
  34. var (accessToken, domain) = context.GetAccessToken();
  35. return Get(domain, accessToken);
  36. }
  37. /// <summary>
  38. /// 获取token缓存(从内存缓存中)
  39. /// </summary>
  40. /// <param name="token">客户请求的token</param>
  41. /// <returns></returns>
  42. public IAccessTokenDTO Get(string domain, string ticket)
  43. {
  44. var accessToken = tokenCore.Get(domain, ticket);
  45. return accessToken;
  46. }
  47. public int Revoke(string domain, string ticket)
  48. {
  49. return tokenCore.Delete(domain, ticket);
  50. }
  51. public IAccessTokenDTO Create(long id, string key, string secret, string roles, string domain, string clientIp)
  52. {
  53. //TODO 暂时就一个客户端授权码,以后做成数据库的
  54. if (string.IsNullOrEmpty(key) || !key.Equals(_consumerKey)) { return null; }
  55. if (string.IsNullOrEmpty(secret) || !secret.Equals(_consumerSecret)) { return null; }
  56. AccessTokenDTO token = Generate(id, key, domain, clientIp);
  57. tokenCore.Create(token);
  58. return token;
  59. }
  60. public AccessTokenDTO Generate(long id, string accessKey, string domain, string clientIp)
  61. {
  62. DateTime now = DateTime.Now;
  63. AccessTokenDTO token = new AccessTokenDTO
  64. {
  65. AccessId = id,
  66. AccessKey = accessKey,
  67. create_time = now.Convert2UnixTimestamp(),
  68. ExpiresIn = 0,
  69. Domain = domain,
  70. ClientIp = clientIp,
  71. AccessTicket = $"{accessKey}|{domain}|{now}|{clientIp}".ToAES256()
  72. };
  73. return token;
  74. }
  75. }
  76. }