UserAuthController.cs 7.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Threading.Tasks;
  5. using Microsoft.AspNetCore.Mvc;
  6. using Microsoft.AspNetCore.Http;
  7. using Microsoft.Extensions.Logging;
  8. using Microsoft.Extensions.Options;
  9. using System.Security.Cryptography;
  10. using System.Text;
  11. using System.IO;
  12. using Library;
  13. using LitJson;
  14. using MySystem.Models;
  15. namespace MySystem.Areas.Api.Controllers
  16. {
  17. [Area("Api")]
  18. [Route("Api/[controller]/[action]")]
  19. public class UserAuthController : BaseController
  20. {
  21. public UserAuthController(IHttpContextAccessor accessor, ILogger<BaseController> logger, IOptions<Setting> setting) : base(accessor, logger, setting)
  22. {
  23. }
  24. #region 小程序-获取secret
  25. public JsonResult GetSecret(string value)
  26. {
  27. value = DesDecrypt(value);
  28. JsonData data = JsonMapper.ToObject(value);
  29. string AppId = data["appId"].ToString(); //小程序AppId
  30. string AuthCode = data["authCode"].ToString(); //小程序授权码
  31. Projects pro = db.Projects.FirstOrDefault(m => m.AppId == AppId);
  32. if(pro == null)
  33. {
  34. return Json(new AppResultJson() { Status = "-1", Info = "appid不存在" });
  35. }
  36. pro = db.Projects.FirstOrDefault(m => m.AppId == AppId && m.AuthCode == AuthCode);
  37. if(pro == null)
  38. {
  39. return Json(new AppResultJson() { Status = "-1", Info = "授权码不正确" });
  40. }
  41. Dictionary<string, object> Obj = new Dictionary<string, object>();
  42. Obj.Add("appSecret", pro.AppSecret); //小程序密钥
  43. Obj.Add("appSalt", pro.AppIv); //小程序IV
  44. return Json(new AppResultJson() { Status = "1", Info = "", Data = Obj });
  45. }
  46. #endregion
  47. #region 小程序-授权
  48. public JsonResult Auth(string value)
  49. {
  50. value = DesDecrypt(value);
  51. JsonData data = JsonMapper.ToObject(value);
  52. string AppId = data["appId"].ToString(); //小程序AppId
  53. string Code = data["code"].ToString(); //加密Code
  54. Projects pro = db.Projects.FirstOrDefault(m => m.AppId == AppId);
  55. if(pro == null)
  56. {
  57. return Json(new AppResultJson() { Status = "-1", Info = "appid不存在" });
  58. }
  59. string Data = AppDesDecrypt(Code, pro.AppSecret, pro.AppIv);
  60. if(string.IsNullOrEmpty(Data))
  61. {
  62. return Json(new AppResultJson() { Status = "-1", Info = "授权失败" });
  63. }
  64. string CheckAppId = Data.Substring(0, 16);
  65. if(CheckAppId != AppId)
  66. {
  67. return Json(new AppResultJson() { Status = "-1", Info = "授权失败" });
  68. }
  69. string UserId = Data.Substring(16);
  70. int PlateformUserId = int.Parse(UserId);
  71. string OpenId = "kxsmp_" + function.MD5_16(UserId).GetHashCode().ToString().Replace("-", "");
  72. string Token = function.MD532(Guid.NewGuid().ToString() + "948576");
  73. UserForProject userFor = db.UserForProject.FirstOrDefault(m => m.PlateformUserId == PlateformUserId && m.AppId == AppId);
  74. if(userFor == null)
  75. {
  76. userFor = db.UserForProject.Add(new UserForProject()
  77. {
  78. CreateDate = DateTime.Now,
  79. UpdateDate = DateTime.Now.AddHours(1),
  80. PlateformUserId = PlateformUserId,
  81. AppId = AppId,
  82. OpenId = OpenId,
  83. Token = Token,
  84. }).Entity;
  85. }
  86. else
  87. {
  88. userFor.UpdateDate = DateTime.Now.AddHours(1);
  89. userFor.OpenId = OpenId;
  90. userFor.Token = Token;
  91. }
  92. db.SaveChanges();
  93. Dictionary<string, object> Obj = new Dictionary<string, object>();
  94. Obj.Add("appToken", Token); //小程序获取用户信息的Token
  95. Obj.Add("openId", OpenId); //小程序openId
  96. return Json(new AppResultJson() { Status = "1", Info = "", Data = Obj });
  97. }
  98. #endregion
  99. #region 小程序-获取用户信息
  100. public JsonResult GetUserInfo(string value)
  101. {
  102. value = DesDecrypt(value);
  103. JsonData data = JsonMapper.ToObject(value);
  104. string AppToken = data["appToken"].ToString(); //小程序获取用户信息的Token
  105. string OpenId = data["openId"].ToString(); //小程序openId
  106. DateTime now = DateTime.Now;
  107. Dictionary<string, object> Obj = new Dictionary<string, object>();
  108. UserForProject userFor = db.UserForProject.FirstOrDefault(m => m.Token == AppToken && m.OpenId == OpenId && m.UpdateDate > now);
  109. if(userFor == null)
  110. {
  111. return Json(new AppResultJson() { Status = "-1", Info = "获取用户信息失败" });
  112. }
  113. PlateformModels.Users user = pdb.Users.FirstOrDefault(m => m.Id == userFor.PlateformUserId) ?? new PlateformModels.Users();
  114. Obj.Add("mobile", user.Mobile);
  115. Obj.Add("nickName", user.RealName); //昵称
  116. Obj.Add("headPhoto", SourceHost + user.HeadPhoto); //头像
  117. string province = "";
  118. string city = "";
  119. string district = "";
  120. if(!string.IsNullOrEmpty(user.Areas))
  121. {
  122. string[] AreaList = user.Areas.Split(',');
  123. if(AreaList.Length > 0) province = AreaList[0];
  124. if(AreaList.Length > 1) province = AreaList[1];
  125. if(AreaList.Length > 2) province = AreaList[2];
  126. }
  127. Obj.Add("province", province); //省
  128. Obj.Add("city", city); //市
  129. Obj.Add("district", district); //区
  130. return Json(new AppResultJson() { Status = "1", Info = "", Data = Obj });
  131. }
  132. #endregion
  133. #region 3DES解密
  134. private string AppDesDecrypt(string encryptedText, string key, string iv)
  135. {
  136. string decryptedText = "";
  137. try
  138. {
  139. byte[] keyArray;
  140. byte[] ivArray;
  141. byte[] encryptedTextArray;
  142. byte[] decryptedTextArray;
  143. TripleDESCryptoServiceProvider tripleDES = new TripleDESCryptoServiceProvider();
  144. keyArray = UTF8Encoding.UTF8.GetBytes(key.Substring(0, 24));
  145. ivArray = UTF8Encoding.UTF8.GetBytes(iv);
  146. encryptedTextArray = Convert.FromBase64String(encryptedText);
  147. tripleDES.Key = keyArray;
  148. tripleDES.IV = ivArray;
  149. ICryptoTransform decryptor = tripleDES.CreateDecryptor(tripleDES.Key, tripleDES.IV);
  150. using (MemoryStream ms = new MemoryStream(encryptedTextArray))
  151. {
  152. using (CryptoStream cs = new CryptoStream(ms, decryptor, CryptoStreamMode.Read))
  153. {
  154. using (StreamReader sr = new StreamReader(cs))
  155. {
  156. decryptedTextArray = Encoding.UTF8.GetBytes(sr.ReadToEnd());
  157. }
  158. }
  159. }
  160. decryptedText = Encoding.UTF8.GetString(decryptedTextArray);
  161. }
  162. catch(Exception ex)
  163. {
  164. function.WriteLog(DateTime.Now.ToString() + "\n" + ex.ToString(), "3DES解密异常");
  165. }
  166. return decryptedText;
  167. }
  168. #endregion
  169. }
  170. }