You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
iot/projects/IoTCenter/Api/ProjectController.cs

327 lines
14 KiB

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

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<ProjectController> logger;
private readonly IConfiguration _cfg;
private readonly ISettingService _settingService;
private readonly IRepository<Organ> _organRepo;
private readonly IRepository<User> _userRepo;
private readonly IRepository<OrganUser> _organUserRepo;
private readonly IRepository<Role> _roleRepo;
private readonly IRepository<UserRole> _userRoleRepo;
public ProjectController(
IWebHostEnvironment env,
IHttpClientFactory httpClientFactory,
ILogger<ProjectController> logger,
IConfiguration cfg,
ISettingService settingService,
IRepository<Organ> organRepo,
IRepository<User> userRepo,
IRepository<OrganUser> organUserRepo,
IRepository<Role> roleRepo,
IRepository<UserRole> 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]
[Route("/Cas")]
public IActionResult Cas(string ticket)
{
var home = this._settingService.GetSetting("home")?.Value ?? "http://10.255.253.183";
var sso = this._settingService.GetSetting("sso")?.Value ?? "http://10.255.253.190/dsssoserver";
if (string.IsNullOrEmpty(ticket))
{//跳转到cas
var url = sso + "/login?service=" + HttpUtility.UrlEncode(home);
return Redirect(url);
}
else
{
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);
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);
}
private string NeiMengWuHai(string result)
{
this.logger.LogInformation(result);
//d_wudaqu 这个是user300348这个是区iddistrict_id。15785这个是person_id。63,12,335这个是rold_id
//d_wudaqu 300348 5LmM6L6+5Yy6566h55CG5ZGY 15785 d_wudaqu 5LmM6L6+5Yy65pWZ6IKy5bGA 5 63,12,335
var doc = new XmlDocument();
doc.LoadXml(result);
var userName = doc.GetElementsByTagName("cas:USER_NAME")[0].InnerText.Trim();
var personId = Convert.ToInt32(doc.GetElementsByTagName("cas:PERSON_ID")[0].InnerText.Trim());
var connStr = this._cfg.GetConnectionString("mariyadb");
try
{
using var db = new BaseDbContext(connStr);
var user = db.Set<Person>().FirstOrDefault(o => o.Id == personId);
var organ = db.Set<Organization>().FirstOrDefault(o => o.OrganId == user.BureauId);
var roles = (from perssonRole in db.Set<PersonRole>().Where(o => o.PersonId == user.Id)
join role in db.Set<SystemRole>() on perssonRole.RoleId equals role.Id
select role.RoleName).Distinct().ToList();
this.Update(userName, user.RealName, organ.Name, organ.Id.ToString(), roles);
}
catch (Exception ex)
{
return connStr + ex.ToString();
}
return userName;
}
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 realName, string organName, string organNumber, List<string> roles)
{
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();
}
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);
}
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 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<Person>().FirstOrDefault(o => o.Id == personId);
var organ = db.Set<Organization>().FirstOrDefault(o => o.OrganId == user.BureauId);
var roles = (from perssonRole in db.Set<PersonRole>().Where(o => o.PersonId == user.Id)
join role in db.Set<SystemRole>() 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();
}
}
}
}