using Application.Domain.Entities; using Infrastructure.Application.Services.Settings; using Infrastructure.Data; using Infrastructure.Extensions; using IoTCenter.NeiMengWuHai; using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Hosting; using Microsoft.AspNetCore.Mvc; using Microsoft.Extensions.Configuration; using Microsoft.Extensions.Hosting; using Microsoft.Extensions.Logging; using System; using System.Collections.Generic; using System.Linq; using System.Net.Http; using System.Web; using System.Xml; namespace IoTCenter.Api.Controllers { [ApiVersion("1.0")] [Route("api/v{version:apiVersion}/[controller]/[action]")] [ApiController] public class ProjectController : ControllerBase { private readonly IWebHostEnvironment _env; private readonly IHttpClientFactory _httpClientFactory; private readonly ILogger _logger; private readonly IConfiguration _cfg; private readonly ISettingService _settingService; private readonly IRepository _organRepo; private readonly IRepository _userRepo; private readonly IRepository _organUserRepo; private readonly IRepository _roleRepo; private readonly IRepository _userRoleRepo; public ProjectController( IWebHostEnvironment env, IHttpClientFactory httpClientFactory, ILogger logger, IConfiguration cfg, ISettingService settingService, IRepository organRepo, IRepository userRepo, IRepository organUserRepo, IRepository roleRepo, IRepository userRoleRepo) { this._env = env; this._httpClientFactory = httpClientFactory; this._logger = logger; this._cfg = cfg; this._settingService = settingService; this._organRepo = organRepo; this._userRepo = userRepo; this._organUserRepo = organUserRepo; this._roleRepo = roleRepo; this._userRoleRepo = userRoleRepo; } [AllowAnonymous] [HttpGet] public IActionResult CasLogin(string ticket, string home) { var sso = this._settingService.GetSetting("sso")?.Value ?? "http://10.255.253.190/dsssoserver"; var url = sso + "/serviceValidate?ticket=" + ticket + "&service=" + HttpUtility.UrlEncode(home); var httpClient = this._httpClientFactory.CreateClient(); var result = httpClient.GetAsync(url).Result.Content.ReadAsStringAsync().Result; var userName = this.NeiMengWuHai(result); this.UpdateInternal(userName); home += "?accessToken=" + Request.HttpContext.GetToken(userName, _cfg, DateTime.Now.AddYears(100)); home += "&refreshToken=" + Request.HttpContext.GetToken(userName, _cfg, DateTime.Now.AddYears(100)); return Redirect(home); } //[AllowAnonymous] //[HttpGet] //public IActionResult CasLogin(string ticket, string home) //{ // var sso = this._settingService.GetSetting("sso")?.Value; // if (_env.IsDevelopment()) // { // sso = sso ?? "http://kpsso.kpedu.com";//debug // home = "http://221.194.113.154:8100";//debug // } // var url = sso + "/serviceValidate?ticket=" + ticket + "&service=" + HttpUtility.UrlEncode(home); // var httpClient = this._httpClientFactory.CreateClient(); // var result = httpClient.GetAsync(url).Result.Content.ReadAsStringAsync().Result; // //string userName = TangShanKaiPing(result); // var userName = this.NeiMengWuHai(result); // if (_env.IsDevelopment()) // { // home = "http://localhost:8100";//debug // } // home += "?accessToken=" + Request.HttpContext.GetToken(userName, _cfg, DateTime.Now.AddYears(100)); // home += "&refreshToken=" + Request.HttpContext.GetToken(userName, _cfg, DateTime.Now.AddYears(100)); // return Redirect(home); //} //[AllowAnonymous] //[HttpGet] //public IActionResult Update(string userName, string realName, string organName, string organNumber, long timestamp, string role, string token) //{ // if (string.IsNullOrEmpty(userName) || string.IsNullOrEmpty(organName)) // { // var message = "参数不能为空"; // this.logger.LogError(message); // return Problem(message); // } // try // { // var query = this.Request.QueryString.ToString().RemoveParam("token").TrimStart('?').Trim(); // var token2 = $"{query},123456".Md5(); // if (token2 != token) // { // var message = "token无效"; // this.logger.LogError(message); // throw new Exception(message); // } // var sendTime = DateTimeOffset.FromUnixTimeSeconds(timestamp); // var seconds = (DateTime.UtcNow - sendTime).TotalSeconds; // if (seconds > 60) // { // var message = $"timestamp差距{seconds}秒"; // this.logger.LogError(message); // throw new Exception(message); // } // User user = UpdateOrganUser(userName, realName, organName, organNumber); // var roles = role.Split(','); // var userRoles = this._userRoleRepo.Table().Where(o => o.User.UserName == userName); // if (roles.Any()) // { // foreach (var item in roles) // { // var role2 = _roleRepo.Table().FirstOrDefault(o => o.Name == item); // if (role2 == null) // { // role2 = new Role { Name = item }; // _roleRepo.Add(role2); // _roleRepo.SaveChanges(); // } // if (!userRoles.Any(o => o.Role.Name == item)) // { // _userRoleRepo.Add(new UserRole { UserId = user.Id, RoleId = role2.Id }); // _userRoleRepo.SaveChanges(); // } // } // } // } // catch (Exception ex) // { // this.logger.LogError(ex.ToString()); // return Problem(ex.Message); // } // return Ok(new // { // AccessToken = Request.HttpContext.GetToken(userName, _cfg, DateTime.Now.AddYears(100)), // RefreshToken = Request.HttpContext.GetToken(userName, _cfg, DateTime.Now.AddYears(100)), // }); //} private string NeiMengWuHai(string result) { this._logger.LogInformation(result); var doc = new XmlDocument(); doc.LoadXml(result); var userName = doc.GetElementsByTagName("cas:USER_NAME")[0].InnerText.Trim(); this.UpdateInternal(userName); return userName; } public void UpdateInternal(string userName) { var connStr = this._cfg.GetConnectionString("mariyadb"); try { using var db = new BaseDbContext(connStr); var personId = db.Set().Where(o => o.LoginName == userName).Select(o=>o.PersonId).FirstOrDefault(); var user = db.Set().FirstOrDefault(o => o.Id == personId); this._logger.LogInformation(user.ToJson()); var organ = db.Set().FirstOrDefault(o => o.OrganId == user.BureauId); this._logger.LogInformation(organ.ToJson()); var roles = (from perssonRole in db.Set().Where(o => o.PersonId == personId) join role in db.Set() on perssonRole.RoleId equals role.Id select role.RoleName).Distinct().ToList(); this.Update(userName,user.Email, user.RealName, organ.Name, organ.Id.ToString(), roles); } catch (Exception ex) { this._logger.LogError( connStr + ex.ToString()); } } private string TangShanKaiPing(string result) { var doc = new XmlDocument(); doc.LoadXml(result); var userName = doc.GetElementsByTagName("cas:USER_NAME")[0].InnerText.Trim(); var realName = doc.GetElementsByTagName("cas:REAL_NAME")[0].InnerText.Trim(); var organNumber = doc.GetElementsByTagName("cas:ORG_ID")[0].InnerText.Trim(); var organName = doc.GetElementsByTagName("cas:ORG_NAME")[0].InnerText.Trim(); UpdateOrganUser(userName, realName, organName, organNumber); return userName; } private void Update(string userName,string email, string realName, string organName, string organNumber, List roles) { //更新机构 var organ = this._organRepo.Table().FirstOrDefault(o => o.Number == organNumber); if (organ == null) { organ = new Organ { Name = organName, Number = organNumber }; this._organRepo.Add(organ); } else { organ.Name = organName; } this._organRepo.SaveChanges(); //更新用户 var user = this._userRepo.Table().FirstOrDefault(o => o.UserName == userName); if (user == null) { user = new User { UserName = userName, RealName=realName, NickName = realName, Email = string.IsNullOrEmpty(email)? $"{userName}@test.com":email }; this._userRepo.Add(user); } else { user.RealName = realName; user.NickName = realName; user.Email = string.IsNullOrEmpty(email) ? $"{userName}@test.com" : email; } this._userRepo.SaveChanges(); //添加用户到机构 var organUser = this._organUserRepo.Table().FirstOrDefault(o => o.UserId == user.Id); if (organUser == null) { organUser = new OrganUser { UserId = user.Id, OrganId = organ.Id }; this._organUserRepo.Add(organUser); } else { organUser.OrganId = organ.Id; } this._organUserRepo.SaveChanges(); //更新角色 if (roles.Any()) { foreach (var item in roles) { var role2 = _roleRepo.Table().FirstOrDefault(o => o.Name == item); if (role2 == null) { role2 = new Role { Name = item }; _roleRepo.Add(role2); _roleRepo.SaveChanges(); } var userRoles = this._userRoleRepo.Table().Where(o => o.User.UserName == userName); if (!userRoles.Any(o => o.Role.Name == item)) { _userRoleRepo.Add(new UserRole { UserId = user.Id, RoleId = role2.Id }); _userRoleRepo.SaveChanges(); } } } } [AllowAnonymous] [HttpGet] public IActionResult Update(string userName, string realName, string organName, string organNumber, long timestamp, string role, string token) { if (string.IsNullOrEmpty(userName) || string.IsNullOrEmpty(organName)) { var message = "参数不能为空"; this._logger.LogError(message); return Problem(message); } try { var query = this.Request.QueryString.ToString().RemoveParam("token").TrimStart('?').Trim(); var token2 = $"{query},123456".Md5(); if (token2 != token) { var message = "token无效"; this._logger.LogError(message); throw new Exception(message); } var sendTime = DateTimeOffset.FromUnixTimeSeconds(timestamp); var seconds = (DateTime.UtcNow - sendTime).TotalSeconds; if (seconds > 60) { var message = $"timestamp差距{seconds}秒"; this._logger.LogError(message); throw new Exception(message); } this.UpdateInternal(userName); } catch (Exception ex) { this._logger.LogError(ex.ToString()); return Problem(ex.Message); } return Ok(new { AccessToken = Request.HttpContext.GetToken(userName, _cfg, DateTime.Now.AddYears(100)), RefreshToken = Request.HttpContext.GetToken(userName, _cfg, DateTime.Now.AddYears(100)), }); } private User UpdateOrganUser(string userName, string realName, string organName, string organNumber) { var organ = this._organRepo.Table().FirstOrDefault(o => o.Name == organName); if (organ == null) { organ = new Organ { Name = organName, Number = organNumber }; this._organRepo.Add(organ); } else { organ.Number = organNumber; } this._organRepo.SaveChanges(); var user = this._userRepo.Table().FirstOrDefault(o => o.UserName == userName); if (user == null) { user = new User { UserName = userName, NickName = realName, Email = $"{userName}@test.com" }; this._userRepo.Add(user); } this._userRepo.SaveChanges(); var organUser = this._organUserRepo.Table().FirstOrDefault(o => o.UserId == user.Id && o.Organ.Id == organ.Id); if (organUser == null) { organUser = new OrganUser { UserId = user.Id, OrganId = organ.Id }; this._organUserRepo.SaveChanges(); } return user; } public IActionResult RedirectTo(string url) { Response.Redirect(url); return new EmptyResult(); } public string Test() { var connStr = this._cfg.GetConnectionString("mariyadb"); try { var personId = 15785; using var db = new BaseDbContext(connStr); var user = db.Set().FirstOrDefault(o => o.Id == personId); var organ = db.Set().FirstOrDefault(o => o.OrganId == user.BureauId); var roles = (from perssonRole in db.Set().Where(o => o.PersonId == user.Id) join role in db.Set() on perssonRole.RoleId equals role.Id select role.RoleName).Distinct().ToList(); return connStr + user.RealName + organ.Name + roles.ToJson(); } catch (Exception ex) { return connStr + ex.ToString(); } } } }