OAuth2Controller.cs 7.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181
  1. using Microsoft.AspNetCore.Mvc;
  2. using System;
  3. using System.Collections.Generic;
  4. using System.Linq;
  5. using System.Threading.Tasks;
  6. using TEAMModelOS.Models;
  7. using TEAMModelOS.SDK.DI;
  8. using System.Text.Json;
  9. using TEAMModelOS.SDK.Models;
  10. using Microsoft.AspNetCore.Http;
  11. using TEAMModelOS.SDK.Extension;
  12. using Azure.Cosmos;
  13. using System.Text;
  14. using TEAMModelOS.SDK.DI.AzureCosmos.Inner;
  15. using Microsoft.Extensions.Options;
  16. using Azure.Messaging.ServiceBus;
  17. using Microsoft.Extensions.Configuration;
  18. using HTEXLib.COMM.Helpers;
  19. using TEAMModelOS.SDK;
  20. using System.IdentityModel.Tokens.Jwt;
  21. using TEAMModelOS.Services;
  22. using TEAMModelOS.SDK.Models.Service;
  23. using System.IO;
  24. using System.Dynamic;
  25. using Microsoft.AspNetCore.Authorization;
  26. using Azure.Storage.Blobs.Models;
  27. using static TEAMModelOS.SDK.Models.Teacher;
  28. using System.Web;
  29. using static TEAMModelOS.Controllers.FixDataController;
  30. using static TEAMModelOS.SDK.SchoolService;
  31. using Microsoft.AspNetCore.Hosting;
  32. using TEAMModelOS.Filter;
  33. using TEAMModelOS.Controllers.Third.Xkw;
  34. using Microsoft.Extensions.Primitives;
  35. using System.Net.Http;
  36. using Microsoft.Azure.Cosmos.Table;
  37. namespace TEAMModelOS.Controllers.Third
  38. {
  39. // <summary>
  40. /// 标准OAuth2
  41. /// </summary>
  42. ///
  43. [ProducesResponseType(StatusCodes.Status200OK)]
  44. [ProducesResponseType(StatusCodes.Status400BadRequest)]
  45. //
  46. //[Route("")]
  47. [ApiController]
  48. public class OAuth2Controller : ControllerBase
  49. {
  50. private readonly SnowflakeId _snowflakeId;
  51. private readonly AzureCosmosFactory _azureCosmos;
  52. private readonly DingDing _dingDing;
  53. private readonly Option _option;
  54. private readonly AzureStorageFactory _azureStorage;
  55. private readonly AzureServiceBusFactory _serviceBus;
  56. private readonly AzureRedisFactory _azureRedis;
  57. private readonly CoreAPIHttpService _coreAPIHttpService;
  58. private readonly ThirdApisService _scsApisService;
  59. private readonly HttpTrigger _httpTrigger;
  60. private readonly IWebHostEnvironment _environment;
  61. /// <summary>
  62. /// 机构安全码
  63. /// </summary>
  64. public string _sc_passKey;
  65. /// <summary>
  66. /// 机构ID
  67. /// </summary>
  68. public string _sc_trainComID;
  69. /// <summary>
  70. /// 机构 AES 密钥
  71. /// </summary>
  72. public string _sc_privateKey;
  73. /// <summary>
  74. /// 访问地址
  75. /// </summary>
  76. public string _sc_url;
  77. public IConfiguration _configuration { get; set; }
  78. public OAuth2Controller(IWebHostEnvironment environment, AzureCosmosFactory azureCosmos, SnowflakeId snowflakeId, DingDing dingDing, IOptionsSnapshot<Option> option, AzureStorageFactory azureStorage,
  79. AzureRedisFactory azureRedis, AzureServiceBusFactory serviceBus, IConfiguration configuration, CoreAPIHttpService coreAPIHttpService, ThirdApisService scsApisService, HttpTrigger httpTrigger)
  80. {
  81. _azureCosmos = azureCosmos;
  82. _snowflakeId = snowflakeId;
  83. _dingDing = dingDing;
  84. _option = option?.Value;
  85. _azureStorage = azureStorage;
  86. _serviceBus = serviceBus;
  87. _configuration = configuration;
  88. _azureRedis = azureRedis;
  89. _coreAPIHttpService = coreAPIHttpService;
  90. _scsApisService = scsApisService;
  91. _httpTrigger = httpTrigger;
  92. _environment = environment;
  93. }
  94. [HttpGet("authorized/xkw")]
  95. [AllowAnonymous]
  96. public IActionResult AuthorizedXkw([FromQuery] OAuthCode authCode) {
  97. OAuthCode code = new OAuthCode();
  98. string QueryString = HttpContext?.Request?.QueryString.Value;
  99. if (!string.IsNullOrWhiteSpace(QueryString)) {
  100. QueryString = HttpUtility.UrlDecode(QueryString).Substring(1);
  101. string [] ps= QueryString.Split("&");
  102. foreach (var p in ps) {
  103. string[] pp=p.Split("=");
  104. if (pp.Length == 2) {
  105. switch (true)
  106. {
  107. case bool when $"{pp[0]}".Equals("tmdid", StringComparison.OrdinalIgnoreCase):
  108. code.tmdid = pp[1];
  109. break;
  110. case bool when $"{pp[0]}".Equals("code", StringComparison.OrdinalIgnoreCase):
  111. code.code = pp[1];
  112. break;
  113. case bool when $"{pp[0]}".Equals("module", StringComparison.OrdinalIgnoreCase):
  114. code.module = pp[1];
  115. break;
  116. default: break;
  117. }
  118. }
  119. }
  120. }
  121. var path =$"{HttpContext?.Request?.Scheme}://{HttpContext?.Request?.Host}/xkw/authorize?code={code.code}&tmdid={code.tmdid}&module={code.module}";
  122. StringValues accessToken;//应该从别的地方获取 不是mvc 无法从Session 获取
  123. HttpContext.Request.Headers.TryGetValue($"xkw-AccessToken", out accessToken);
  124. if (!_option.Location.Contains("China"))
  125. {
  126. return BadRequest();
  127. }
  128. return Redirect(path);
  129. }
  130. [HttpPost("oauth/check-bind")]
  131. [Authorize(Roles = "IES")]
  132. [AuthToken(Roles = "teacher,admin,area,student")]
  133. public async Task<IActionResult> CheckBind(JsonElement json)
  134. {
  135. string domain = HttpContext?.Request?.Host.Host;
  136. var (tmdid, _, _, school, area, keyData) = HttpContext.GetAuthTokenKey();
  137. var table = _azureStorage.GetCloudTableClient().GetTableReference("IESOAuth");
  138. //List<string> Codes = new List<string>();
  139. //if (!string.IsNullOrWhiteSpace(tmdid))
  140. //{
  141. // Codes.Add($" Code {QueryComparisons.Equal} '{tmdid}' ");
  142. //}
  143. //if (!string.IsNullOrWhiteSpace(school))
  144. //{
  145. // Codes.Add($" Code {QueryComparisons.Equal} '{school}' ");
  146. //}
  147. //if (!string.IsNullOrWhiteSpace(area))
  148. //{
  149. // Codes.Add($" Code {QueryComparisons.Equal} '{area}' ");
  150. //}
  151. //string qurey = $"PartitionKey {QueryComparisons.Equal} 'OAuthShow' and Domain {QueryComparisons.Equal} '{domain}' and ( { string.Join(" or ", Codes)} ) ";
  152. //var result = await table.ExecuteQuerySegmentedAsync(new TableQuery<OAuthShow>().Where(qurey), null);
  153. //List<OAuthShow> shows = result.Results;
  154. //List<OAuthShow> schoolShow = new List<OAuthShow>();
  155. //var schoolShows = shows?.Where(y => !y.Scope.Equals("private"));
  156. //if (schoolShows.Any())
  157. //{
  158. // schoolShows.ToList().ForEach(y => { y.Scope = "school"; y.Code = school; });
  159. // schoolShows.GroupBy(x => $"{x.Type}{x.Scope}").Select(s => new { key = s.Key, list = s.ToList() }).ToList().ForEach(z => {
  160. // schoolShow.Add(z.list.First());
  161. // });
  162. //}
  163. List<OAuthUser> authUsers = await table.FindListByDict<OAuthUser>(new Dictionary<string, object>() { { "RowKey", tmdid }, { "Domain", domain } });
  164. return Ok(new
  165. {
  166. auth = authUsers.Select(x => new { type = x.Type, tmdid = x.RowKey, time = x.Time }),
  167. //privateShows = shows?.FindAll(x => x.Scope.Equals("private")).Select(x => new { x.Type, x.Status, x.Scope, x.Code }),
  168. //schoolShows = schoolShow.Select(x => new { x.Type, x.Status, x.Scope, x.Code })
  169. });
  170. }
  171. }
  172. }