OAuthHelper.cs 3.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108
  1. using AuthorizeCenter.Services;
  2. using Cksoft.Unity;
  3. using DllUfpEntity.Dto;
  4. using IdentityModel.Client;
  5. using Newtonsoft.Json;
  6. using NLog;
  7. using System;
  8. using System.Collections.Generic;
  9. using System.Linq;
  10. using System.Net.Http;
  11. using System.Text;
  12. using System.Threading.Tasks;
  13. namespace DllUfpUtil
  14. {
  15. public class OAuthHelper
  16. {
  17. public async static Task<UserInfo> GetUserInfo(string token)
  18. {
  19. var logger = LogManager.LoadConfiguration("NLog.config").GetCurrentClassLogger();
  20. var handler = new HttpClientHandler();
  21. handler.ClientCertificateOptions = ClientCertificateOption.Manual;
  22. handler.ServerCertificateCustomValidationCallback =
  23. (httpRequestMessage, cert, certChain, policyErrors) =>
  24. {
  25. return true;
  26. };
  27. var client = new HttpClient(handler);
  28. var discoRequest = new DiscoveryDocumentRequest()
  29. {
  30. Policy = new DiscoveryPolicy
  31. {
  32. RequireHttps = false,
  33. },
  34. Address = AppConfigurtaionServices.Configuration["Id4:Authority"]
  35. };
  36. var disco = await client.GetDiscoveryDocumentAsync(discoRequest);
  37. if (disco == null)
  38. {
  39. logger.Error("读取Id4配置失败");
  40. return null;
  41. }
  42. if (disco.IsError)
  43. {
  44. logger.Error("获取配置失败" + disco.Error.ToString());
  45. return null;
  46. }
  47. using (HttpClient apiClient = new HttpClient(handler))
  48. {
  49. apiClient.SetBearerToken(token);
  50. var userinfo = await apiClient.GetUserInfoAsync(new UserInfoRequest
  51. {
  52. Address = disco.UserInfoEndpoint,
  53. Token = token
  54. });
  55. if (userinfo.IsError)
  56. {
  57. logger.Error("获取用户信息失败" + userinfo.Error.ToString());
  58. return null;
  59. }
  60. var claims = userinfo.Claims;
  61. logger.Error("CLAIMS");
  62. logger.Error(JsonConvert.SerializeObject(claims));
  63. return new UserInfo
  64. {
  65. IsSA = Convert.ToInt32(claims.FirstOrDefault(c => c.Type == "isSA")?.Value ?? "-1"),
  66. UserAccount = claims.FirstOrDefault(c => c.Type == "account")?.Value,
  67. UserName = claims.FirstOrDefault(c => c.Type == "realName")?.Value,
  68. UserId = claims.FirstOrDefault(c => c.Type == "sub")?.Value
  69. };
  70. }
  71. }
  72. public async static Task<bool> RevokeToken(string accesstoken)
  73. {
  74. var client = new HttpClient();
  75. var logger = LogManager.LoadConfiguration("NLog.config").GetCurrentClassLogger();
  76. logger.Error("开始销毁TOKEN:" + accesstoken);
  77. var disco = await client.GetDiscoveryDocumentAsync(AppConfigurtaionServices.Configuration["Id4:Authority"]);
  78. if (disco.IsError)
  79. {
  80. logger.Error("获取配置失败" + disco.Error.ToString());
  81. return false;
  82. }
  83. var apiclient = new HttpClient();
  84. var result = await apiclient.RevokeTokenAsync(new TokenRevocationRequest
  85. {
  86. Address = disco.RevocationEndpoint,
  87. ClientId = "EAPAPI",
  88. ClientSecret = "secret",
  89. Token = accesstoken
  90. });
  91. if (result.IsError)
  92. {
  93. logger.Error("销毁Token失败" + result.Error.ToString());
  94. return false;
  95. }
  96. else
  97. {
  98. logger.Error("销毁Token成功" + result.HttpResponse.Content);
  99. return true;
  100. }
  101. }
  102. }
  103. }