using IES.ExamServer.Helper; using Microsoft.AspNetCore.Http.HttpResults; using Microsoft.AspNetCore.Mvc; using Microsoft.Extensions.Caching.Memory; using Microsoft.Extensions.Configuration; using System.IO; using System.Linq; using System.Net.Http; using System.Text.Json.Nodes; using System.DrawingCore; using System.DrawingCore.Imaging; using System.DirectoryServices.ActiveDirectory; using ZXing.QrCode.Internal; using System.Text.Json; using ZXing.Aztec.Internal; using System.IdentityModel.Tokens.Jwt; using IES.ExamServer.Models; using System.Net.Http.Json; namespace IES.ExamServer.Controllers { [Route("core")] [ApiController] public class HomeController : ControllerBase { private readonly IConfiguration _configuration; private readonly IHttpClientFactory _httpClientFactory; private readonly IMemoryCache _memoryCache; public HomeController(IConfiguration configuration, IHttpClientFactory httpClientFactory, IMemoryCache memoryCache) { _configuration=configuration; _httpClientFactory=httpClientFactory; _memoryCache=memoryCache; } [HttpGet("/init")] public async Task Init() { int code = 0; string msg = string.Empty; try { _memoryCache.TryGetValue(Constant._KeyServerCenter, out JsonNode? data); if (data!=null) { return Ok(new { code = 200, msg = "云端服务连接成功!", data = data }); } else { code=500; msg="云端服务未连接!"; } } catch (Exception ex) { code=500; msg="云端服务未连接!"; } return Ok(new { code, msg }); } /** { "type":"sms",//qrcode二维码扫码登录:randomCode必传; sms 短信验证登录:randomCode必传,mobile必传 "randomCode", "mobile":"1528377****" } **/ /// /// 登录验证 /// /// /// [HttpPost("/login-check")] public async Task LoginCheck(JsonNode json) { string randomCode = $"{json["randomCode"]}"; System.Net.ServicePointManager.SecurityProtocol = System.Net.SecurityProtocolType.Tls12; string? CenterUrl = _configuration.GetValue("ExamServer:CenterUrl"); var response = await _httpClientFactory.CreateClient().GetAsync($"{CenterUrl}/hita/check-login?code={randomCode}"); if (response.IsSuccessStatusCode) { string content = await response.Content.ReadAsStringAsync(); if (!string.IsNullOrWhiteSpace(content)) { var jsons = JsonSerializer.Deserialize(content); if (jsons != null) { TmdidImplicit? token = JsonSerializer.Deserialize(jsons["implicit_token"]); string x_auth_token = $"{jsons["x_auth_token"]}"; List? schools = JsonSerializer.Deserialize>(jsons["schools"]); var jwt = new JwtSecurityToken(token?.id_token); var id = jwt.Payload.Sub; jwt.Payload.TryGetValue("name", out object? name); jwt.Payload.TryGetValue("picture", out object? picture); } } } return Ok(); } /// /// 登录模式初始化 /// /// [HttpGet("/login-init")] public async Task LoginInit(JsonNode json) { var type = json["type"]; string qrcode = string.Empty; string randomCode = ""; switch (true) { case bool when $"{type}".Equals("qrcode"): { // 生成二维码图片 Random random = new Random(); randomCode = $"{random.Next(1000, 9999)}"; string? CenterUrl = _configuration.GetValue("ExamServer:CenterUrl"); string content = $"{CenterUrl}/joinSchool?schoolCode=login:{randomCode}&m=%E7%99%BB%E5%BD%95&o=1"; Bitmap qrCodeImage = QRCodeHelper.GetBitmap(content, 200, 200); using (MemoryStream stream = new MemoryStream()) { qrCodeImage.Save(stream, ImageFormat.Png); byte[] data = stream.ToArray(); qrcode=$"data:image/png;base64,{Convert.ToBase64String(data)}"; } return Ok(new { code = 200, randomCode = randomCode, qrcode, type }); } case bool when $"{type}".Equals("smspin"): { int send = 0; if ( !string.IsNullOrWhiteSpace($"{json["area"]}") && !string.IsNullOrWhiteSpace($"{json["to"]}")) { string? CenterUrl = _configuration.GetValue("ExamServer:CenterUrl"); string url = $"{CenterUrl}/core/sendsms/pin"; HttpResponseMessage message= await _httpClientFactory.CreateClient().PostAsJsonAsync(url, new { }); if (message.IsSuccessStatusCode) { string content =await message.Content.ReadAsStringAsync(); JsonNode? jsonNode = JsonSerializer.Deserialize(content); if (jsonNode!=null && int.TryParse($"{jsonNode["send"]}", out int s)) { send = s; } } } return Ok(new { code = 200, send, type }); } } return Ok(new { code = 400}); } } }