颐和api

TokenController.cs 31KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771
  1. using System;
  2. using System.Threading.Tasks;
  3. using Microsoft.AspNetCore.Mvc;
  4. using Api.SignToken;
  5. using Microsoft.AspNetCore.Authorization;
  6. using System.Security.Claims;
  7. using Microsoft.AspNetCore.Authentication.JwtBearer;
  8. using Microsoft.IdentityModel.Tokens;
  9. using System.Text;
  10. using Microsoft.Extensions.Configuration;
  11. using MadRunFabric.Common;
  12. using Microsoft.Extensions.Logging;
  13. using SignTokenApi.IRepositories;
  14. using Microsoft.Extensions.Caching.Distributed;
  15. using MongoDB.Bson;
  16. using SignTokenApi.Repositories;
  17. using NLog;
  18. using MadRunFabric.Model;
  19. using System.Linq;
  20. // For more information on enabling Web API for empty projects, visit https://go.microsoft.com/fwlink/?LinkID=397860
  21. namespace SignTokenApi.Controllers
  22. {
  23. [Authorize]
  24. [Route("api/[controller]")]
  25. public class TokenController : BaseController
  26. {
  27. private readonly IConfiguration _configuration;
  28. private readonly ILogger<TokenController> _logger;
  29. private readonly IDistributedCache _cache;
  30. private readonly ISys_User_AccountRepository _sys_user_accountRepository;
  31. private readonly ISys_Role_InfoRepository _sys_roleinfoRepository;
  32. private readonly ISys_Login_LogsRepository _sys_login_logsRepository;
  33. static Logger Logger = LogManager.GetCurrentClassLogger();
  34. public TokenController(IConfiguration configuration, IDistributedCache cache, ISys_User_AccountRepository sys_user_accountRepository, ISys_Role_InfoRepository sys_roleinfoRepository, ISys_Login_LogsRepository sys_login_logsRepository, ILogger<TokenController> logger)
  35. {
  36. _configuration = configuration;
  37. _cache = cache;
  38. _sys_user_accountRepository = sys_user_accountRepository;
  39. _sys_roleinfoRepository = sys_roleinfoRepository;
  40. _sys_login_logsRepository = sys_login_logsRepository;
  41. _logger = logger;
  42. }
  43. /// <summary>
  44. /// 用户登录
  45. /// </summary>
  46. /// <param name="username">账号</param>
  47. /// <param name="password">MD5加密后的密码</param>
  48. /// <param name="channel">渠道来源 1表示PC 2表示安卓 3表示IOS 4表示微信</param>
  49. /// <param name="returnUrl">跳转的url</param>
  50. /// <returns></returns>
  51. [AllowAnonymous]
  52. [HttpPost("login")]
  53. public async Task<IActionResult> Login(string usercode, string password, int channel = 1, string returnUrl = null)
  54. {
  55. if (_configuration["IsLogin"] == "0")
  56. {
  57. return Error("系统异常,请稍后重试");
  58. }
  59. #region 获取ip地址
  60. var ip = IPHelper.GetIp(this.HttpContext);
  61. #endregion
  62. #region 用户信息判断及查找
  63. if (!ValidateHelper.IsAllPlumpString(usercode, password))
  64. {
  65. return Error("用户名或密码不能为空!");
  66. }
  67. var user = await _sys_user_accountRepository.GetSingle(x => x.usercode == usercode && x.password == password && x.delete_flag==false);
  68. if (user == null) { return Error("用户名或密码错误!"); }
  69. //判断禁用标志是否true
  70. if (user.lock_flag)
  71. {
  72. await AddLogAsync(user.username, usercode, "被禁止访问", ip, channel);
  73. return Error("当前账户被禁止登录访问!");
  74. }
  75. #endregion
  76. #region 角色判断
  77. var roleinfo = await _sys_roleinfoRepository.GetSingle(x => x.id == user.role_id);
  78. //查询角色 如若查询不到,反馈 不要直接反馈明显信息
  79. if (roleinfo == null)
  80. {
  81. await AddLogAsync(user.username, usercode, "无相关角色信息", ip, channel);
  82. return Error("当前用户涉嫌非法访问!");
  83. }
  84. if (roleinfo.role_lock == 1)
  85. {
  86. await AddLogAsync(user.username, usercode, "当前角色被禁止访问", ip, channel);
  87. return Error("当前用户角色权限被禁止登录!");
  88. }
  89. #endregion
  90. #region JWT token生成
  91. var signingKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(_configuration["Jwt:SecretKey"].ToString()));
  92. var signingCredentials = new SigningCredentials(signingKey, SecurityAlgorithms.HmacSha256);
  93. var role_name = roleinfo.role_name;
  94. var permissionRequirement = new PermissionRequirement(
  95. "/api/denied",
  96. ClaimTypes.Role,
  97. _configuration["Jwt:Issuer"].ToString(),
  98. _configuration["Jwt:Audience"].ToString(),
  99. signingCredentials,
  100. expiration: TimeSpan.FromDays(Convert.ToInt32(_configuration["Jwt:Expiration"]))
  101. );
  102. var claims = new Claim[] {
  103. new Claim(ClaimTypes.PrimarySid, user.id),//用户id
  104. new Claim(ClaimTypes.GroupSid,channel.ToString()),//渠道来源
  105. new Claim(ClaimTypes.Sid, user.usercode),//用户账号
  106. new Claim(ClaimTypes.Name, user.username),//用户名字
  107. new Claim(ClaimTypes.Role, user.role_id),//角色id
  108. new Claim("RoleCode", roleinfo.role_code),//角色code
  109. new Claim(ClaimTypes.DenyOnlySid, ""),//微信id
  110. new Claim(ClaimTypes.Expiration,DateTime.Now.AddSeconds(permissionRequirement.Expiration.TotalSeconds).ToString())
  111. };
  112. //用户标识
  113. var identity = new ClaimsIdentity(JwtBearerDefaults.AuthenticationScheme);
  114. identity.AddClaims(claims);
  115. var jwt_token = JwtToken.BuildJwtToken(claims, permissionRequirement);
  116. #endregion
  117. await AddLogAsync(user.username, usercode, "登录成功", ip, channel);
  118. var info = "";
  119. //#region 判断属于哪个坐席
  120. ////zxz是364 kfz365
  121. ////获取坐席组信息
  122. //var groupinfo = user.groupid;
  123. //#endregion
  124. ////提示授权到期还有多少天
  125. //string info = "";
  126. //DateTime dateauth = DateTime.Parse(_configuration["AuthDate"]);
  127. //int Reminddays = int.Parse(_configuration["Reminddays"]);
  128. //var days = (dateauth - DateTime.Now).TotalDays;
  129. //if (days < Reminddays)
  130. //{
  131. // info = "距离授权到期还有"+ days + "天,请联系厂家";
  132. //}
  133. var result = new
  134. {
  135. username = user.username,
  136. usercode = user.usercode,
  137. token = jwt_token,
  138. type = user.type,
  139. seat_flag = user.seat_flag,
  140. group = user.groupid,// "364",// user.group,
  141. role_name = role_name,
  142. role_id = user.role_id,
  143. role_code= roleinfo.role_code,
  144. dept_id = user.dept_id,
  145. team_id = user.team_id,
  146. mobile = user.mobile,
  147. head_img = user.head_img,
  148. weixin = user.weixin,
  149. weixin_name = user.weixin_name,
  150. weixin_img = user.weixin_img,
  151. remark=user.remark,
  152. returninfo=info
  153. };
  154. return Success("登录成功!", result);
  155. }
  156. [HttpPost("update_token")]
  157. public async Task<IActionResult> Update_Token(int channel = 1)
  158. {
  159. #region 获取ip地址
  160. var ip = IPHelper.GetIp(this.HttpContext);
  161. #endregion
  162. #region 用户信息判断及查找
  163. string usercode = User.Claims.FirstOrDefault(c => c.Type == ClaimTypes.Sid).Value;
  164. var user = await _sys_user_accountRepository.GetSingle(x => x.usercode == usercode && x.delete_flag==false);
  165. if (user == null) { return Error("当前用户资料被删除!"); }
  166. //判断删除标志及禁用标志是否true
  167. if (user.delete_flag || user.lock_flag)
  168. {
  169. await AddLogAsync(user.username, usercode, "被禁止访问", ip, channel);
  170. return Error("当前账户被禁止登录访问!");
  171. }
  172. #endregion
  173. #region 角色判断
  174. var roleinfo = await _sys_roleinfoRepository.GetSingle(x => x.id == user.role_id);
  175. //查询角色 如若查询不到,反馈 不要直接反馈明显信息
  176. if (roleinfo == null)
  177. {
  178. await AddLogAsync(user.username, usercode, "无相关角色信息", ip, channel);
  179. return Error("当前用户涉嫌非法访问!");
  180. }
  181. if (roleinfo.role_lock == 1)
  182. {
  183. await AddLogAsync(user.username, usercode, "当前角色被禁止访问", ip, channel);
  184. return Error("当前用户角色权限被禁止登录!");
  185. }
  186. #endregion
  187. #region JWT token生成
  188. var signingKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(_configuration["Jwt:SecretKey"].ToString()));
  189. var signingCredentials = new SigningCredentials(signingKey, SecurityAlgorithms.HmacSha256);
  190. var role_name = roleinfo.role_name;
  191. var permissionRequirement = new PermissionRequirement(
  192. "/api/denied",
  193. ClaimTypes.Role,
  194. _configuration["Jwt:Issuer"].ToString(),
  195. _configuration["Jwt:Audience"].ToString(),
  196. signingCredentials,
  197. expiration: TimeSpan.FromDays(Convert.ToInt32(_configuration["Jwt:Expiration"]))
  198. );
  199. var claims = new Claim[] {
  200. new Claim(ClaimTypes.PrimarySid, user.id),//用户id
  201. new Claim(ClaimTypes.GroupSid,channel.ToString()),//渠道来源
  202. new Claim(ClaimTypes.Sid, user.usercode),//用户账号
  203. new Claim(ClaimTypes.Name, user.username),//用户名字
  204. new Claim(ClaimTypes.Role, user.role_id),//角色id
  205. new Claim("RoleCode", roleinfo.role_code),//角色code
  206. new Claim(ClaimTypes.DenyOnlySid, ""),//微信id
  207. new Claim(ClaimTypes.Expiration,DateTime.Now.AddSeconds(permissionRequirement.Expiration.TotalSeconds).ToString())
  208. };
  209. //用户标识
  210. var identity = new ClaimsIdentity(JwtBearerDefaults.AuthenticationScheme);
  211. identity.AddClaims(claims);
  212. var jwt_token = JwtToken.BuildJwtToken(claims, permissionRequirement);
  213. #endregion
  214. await AddLogAsync(user.username, usercode, "token更新成功", ip, channel);
  215. var result = new
  216. {
  217. username = user.username,
  218. usercode = user.usercode,
  219. token = jwt_token,
  220. type = user.type,
  221. seat_flag = user.seat_flag,
  222. group = user.group,
  223. role_name = role_name,
  224. role_id = user.role_id,
  225. role_code = roleinfo.role_code,
  226. dept_id = user.dept_id,
  227. team_id = user.team_id,
  228. mobile = user.mobile,
  229. head_img = user.head_img,
  230. weixin = user.weixin,
  231. weixin_name = user.weixin_name,
  232. weixin_img = user.weixin_img
  233. };
  234. return Success("token更新成功!", result);
  235. }
  236. ///// <summary>
  237. ///// 微信诺达用户登录
  238. ///// </summary>
  239. ///// <param name="usercode"></param>
  240. ///// <param name="password"></param>
  241. ///// <param name="openid"></param>
  242. ///// <param name="username"></param>
  243. ///// <param name="img"></param>
  244. ///// <param name="returnUrl"></param>
  245. ///// <returns></returns>
  246. //[AllowAnonymous]
  247. //[HttpPost("wechat_admin_login")]
  248. //public async Task<IActionResult> Wechat_Admin_Login(string usercode, string password, string weixin, string weixin_name, string weixin_img, int channel = 4, string returnUrl = null)
  249. //{
  250. // #region 获取ip地址
  251. // var ip = IPHelper.GetIp(this.HttpContext);
  252. // #endregion
  253. // #region 用户信息判断及查找
  254. // if (!ValidateHelper.IsAllPlumpString(usercode, password))
  255. // {
  256. // return Error("用户名或密码不能为空!");
  257. // }
  258. // var user = await _sys_user_accountRepository.GetSingle(x => x.usercode == usercode && x.password == password);
  259. // if (user == null) { return Error("用户名或密码错误!"); }
  260. // //判断删除标志及禁用标志是否true
  261. // if (user.delete_flag || user.lock_flag)
  262. // {
  263. // _logger.LogWarning($"{user.usercode}被禁止访问");
  264. // await AddLogAsync(user.username, usercode, "被禁止访问", ip, channel);
  265. // return Error("当前账户被禁止登录访问!");
  266. // }
  267. // #endregion
  268. // #region 角色判断
  269. // var roleinfo = await _sys_roleinfoRepository.GetSingle(x => x.id == user.role_id);
  270. // //查询角色 如若查询不到,反馈 不要直接反馈明显信息
  271. // if (roleinfo == null)
  272. // {
  273. // _logger.LogWarning($"{user.usercode}登录因查询不到角色{user.role_id}被禁止访问");
  274. // await AddLogAsync(user.username, usercode, "无相关角色信息", ip, channel);
  275. // return Error("当前用户涉嫌非法访问!");
  276. // }
  277. // if (roleinfo.role_lock == 1)
  278. // {
  279. // _logger.LogWarning($"{user.usercode}登录因角色{user.role_id}上锁被禁止访问");
  280. // await AddLogAsync(user.username, usercode, "当前角色被禁止访问", ip, channel);
  281. // return Error("当前用户角色权限被禁止登录!");
  282. // }
  283. // #endregion
  284. // #region 更新当前用户的微信账号
  285. // user.weixin = weixin;
  286. // user.weixin_name = weixin_name;
  287. // user.weixin_img = weixin_img;
  288. // if (user.head_img == "")
  289. // {
  290. // user.head_img = user.weixin_img;
  291. // }
  292. // await _sys_user_accountRepository.UpdateOne(user);
  293. // #endregion
  294. // #region JWT token生成
  295. // var signingKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(_configuration["Jwt:SecretKey"].ToString()));
  296. // var signingCredentials = new SigningCredentials(signingKey, SecurityAlgorithms.HmacSha256);
  297. // var role_name = roleinfo.role_name;
  298. // var permissionRequirement = new PermissionRequirement(
  299. // "/api/denied",
  300. // ClaimTypes.Role,
  301. // _configuration["Jwt:Issuer"].ToString(),
  302. // _configuration["Jwt:Audience"].ToString(),
  303. // signingCredentials,
  304. // expiration: TimeSpan.FromDays(Convert.ToInt32(_configuration["Jwt:Expiration"]))
  305. // );
  306. // var claims = new Claim[] {
  307. // new Claim(ClaimTypes.PrimarySid, user.id),//用户id
  308. // new Claim(ClaimTypes.GroupSid,channel.ToString()),//渠道来源
  309. // new Claim(ClaimTypes.Sid, user.usercode),//用户账号
  310. // new Claim(ClaimTypes.Name, user.username),//用户名字
  311. // new Claim(ClaimTypes.Role, user.role_id),//角色id
  312. // new Claim(ClaimTypes.DenyOnlySid, weixin),//微信id
  313. // new Claim(ClaimTypes.Expiration,DateTime.Now.AddSeconds(permissionRequirement.Expiration.TotalSeconds).ToString())
  314. // };
  315. // //用户标识
  316. // var identity = new ClaimsIdentity(JwtBearerDefaults.AuthenticationScheme);
  317. // identity.AddClaims(claims);
  318. // var jwt_token = JwtToken.BuildJwtToken(claims, permissionRequirement);
  319. // #endregion
  320. // await AddLogAsync(user.username, usercode, "登录成功", ip, channel);
  321. // var result = new
  322. // {
  323. // username = user.username,
  324. // usercode = user.usercode,
  325. // token = jwt_token,
  326. // type = user.type,
  327. // seat_flag = user.seat_flag,
  328. // group = user.group,
  329. // role_name = role_name,
  330. // role_id = user.role_id,
  331. // dept_id = user.dept_id,
  332. // team_id = user.team_id,
  333. // mobile = user.mobile,
  334. // head_img = user.head_img,
  335. // weixin = user.weixin,
  336. // weixin_name = user.weixin_name,
  337. // weixin_img = user.weixin_img
  338. // };
  339. // return Success("登录成功!", result);
  340. //}
  341. /// <summary>
  342. /// 微信诺达用户登录
  343. /// </summary>
  344. /// <param name="usercode"></param>
  345. /// <param name="password"></param>
  346. /// <param name="openid"></param>
  347. /// <param name="username"></param>
  348. /// <param name="img"></param>
  349. /// <param name="returnUrl"></param>
  350. /// <returns></returns>
  351. [AllowAnonymous]
  352. [HttpPost("wechat_admin_login")]
  353. public async Task<IActionResult> Wechat_Admin_Login(string usercode, string password, int channel = 4, string returnUrl = null)
  354. {
  355. #region 获取ip地址
  356. var ip = IPHelper.GetIp(this.HttpContext);
  357. #endregion
  358. #region 用户信息判断及查找
  359. if (!ValidateHelper.IsAllPlumpString(usercode, password))
  360. {
  361. return Error("用户名或密码不能为空!");
  362. }
  363. var user = await _sys_user_accountRepository.GetSingle(x => x.usercode == usercode && x.password == password && x.delete_flag==false);
  364. if (user == null) { return Error("用户名或密码错误!"); }
  365. //判断删除标志及禁用标志是否true
  366. if (user.delete_flag || user.lock_flag)
  367. {
  368. _logger.LogWarning($"{user.usercode}被禁止访问");
  369. await AddLogAsync(user.username, usercode, "被禁止访问", ip, channel);
  370. return Error("当前账户被禁止登录访问!");
  371. }
  372. #endregion
  373. #region 角色判断
  374. var roleinfo = await _sys_roleinfoRepository.GetSingle(x => x.id == user.role_id);
  375. //查询角色 如若查询不到,反馈 不要直接反馈明显信息
  376. if (roleinfo == null)
  377. {
  378. _logger.LogWarning($"{user.usercode}登录因查询不到角色{user.role_id}被禁止访问");
  379. await AddLogAsync(user.username, usercode, "无相关角色信息", ip, channel);
  380. return Error("当前用户涉嫌非法访问!");
  381. }
  382. if (roleinfo.role_lock == 1)
  383. {
  384. _logger.LogWarning($"{user.usercode}登录因角色{user.role_id}上锁被禁止访问");
  385. await AddLogAsync(user.username, usercode, "当前角色被禁止访问", ip, channel);
  386. return Error("当前用户角色权限被禁止登录!");
  387. }
  388. #endregion
  389. #region 更新当前用户的微信账号
  390. string weixin = User.Claims.FirstOrDefault(c => c.Type == ClaimTypes.Sid).Value;
  391. var wxuserold = await _sys_user_accountRepository.GetSingle(x => x.weixin == weixin && x.type != 2);
  392. wxuserold.weixin = "";
  393. wxuserold.weixin_name = "";
  394. wxuserold.weixin_img = "";
  395. await _sys_user_accountRepository.UpdateOne(wxuserold);
  396. var wxuser = await _sys_user_accountRepository.GetSingle(x => x.usercode == weixin);
  397. user.weixin = weixin;
  398. user.weixin_name = wxuser.weixin_name;
  399. user.weixin_img = wxuser.weixin_img;
  400. if (user.head_img == "")
  401. {
  402. user.head_img = user.weixin_img;
  403. }
  404. await _sys_user_accountRepository.UpdateOne(user);
  405. #endregion
  406. #region JWT token生成
  407. var signingKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(_configuration["Jwt:SecretKey"].ToString()));
  408. var signingCredentials = new SigningCredentials(signingKey, SecurityAlgorithms.HmacSha256);
  409. var role_name = roleinfo.role_name;
  410. var permissionRequirement = new PermissionRequirement(
  411. "/api/denied",
  412. ClaimTypes.Role,
  413. _configuration["Jwt:Issuer"].ToString(),
  414. _configuration["Jwt:Audience"].ToString(),
  415. signingCredentials,
  416. expiration: TimeSpan.FromDays(Convert.ToInt32(_configuration["Jwt:Expiration"]))
  417. );
  418. var claims = new Claim[] {
  419. new Claim(ClaimTypes.PrimarySid, user.id),//用户id
  420. new Claim(ClaimTypes.GroupSid,channel.ToString()),//渠道来源
  421. new Claim(ClaimTypes.Sid, user.usercode),//用户账号
  422. new Claim(ClaimTypes.Name, user.username),//用户名字
  423. new Claim(ClaimTypes.Role, user.role_id),//角色id
  424. new Claim("RoleCode", roleinfo.role_code),//角色code
  425. new Claim(ClaimTypes.DenyOnlySid, weixin),//微信id
  426. new Claim(ClaimTypes.Expiration,DateTime.Now.AddSeconds(permissionRequirement.Expiration.TotalSeconds).ToString())
  427. };
  428. //用户标识
  429. var identity = new ClaimsIdentity(JwtBearerDefaults.AuthenticationScheme);
  430. identity.AddClaims(claims);
  431. var jwt_token = JwtToken.BuildJwtToken(claims, permissionRequirement);
  432. #endregion
  433. await AddLogAsync(user.username, usercode, "登录成功", ip, channel);
  434. var result = new
  435. {
  436. username = user.username,
  437. usercode = user.usercode,
  438. token = jwt_token,
  439. type = user.type,
  440. seat_flag = user.seat_flag,
  441. group = user.group,
  442. role_name = role_name,
  443. role_code = roleinfo.role_code,
  444. role_id = user.role_id,
  445. dept_id = user.dept_id,
  446. team_id = user.team_id,
  447. mobile = user.mobile,
  448. head_img = user.head_img,
  449. weixin = user.weixin,
  450. weixin_name = user.weixin_name,
  451. weixin_img = user.weixin_img
  452. };
  453. return Success("登录成功!", result);
  454. }
  455. [AllowAnonymous]
  456. [HttpPost("wechat_login")]
  457. public async Task<IActionResult> Wechat_Login(string weixin, string weixin_name, string weixin_img, int channel = 4, string returnUrl = null)
  458. {
  459. #region 获取ip地址
  460. var ip = IPHelper.GetIp(this.HttpContext);
  461. #endregion
  462. #region 用户信息判断及查找
  463. var user = await _sys_user_accountRepository.GetSingle(x => x.usercode == weixin && x.delete_flag == false);
  464. if (user == null)
  465. {
  466. user = new Sys_User_Account();
  467. user.id = ObjectId.GenerateNewId().ToString();
  468. user.weixin = weixin;
  469. user.usercode = weixin;
  470. user.weixin_img = weixin_img;
  471. user.weixin_name = weixin_name;
  472. user.username = weixin_name;
  473. user.head_img = user.weixin_img;
  474. user.head_small_img= user.weixin_img;
  475. user.type = 2;
  476. user.certificate = new System.Collections.Generic.List<FileBaseModel>();
  477. user.idcard = new System.Collections.Generic.List<FileBaseModel>();
  478. user.projectlist = new System.Collections.Generic.List<string>();
  479. user.postlist = new System.Collections.Generic.List<string>();
  480. await _sys_user_accountRepository.Add(user);
  481. }
  482. else
  483. {
  484. user.weixin = weixin;
  485. user.weixin_name = weixin_name;
  486. user.weixin_img = weixin_img;
  487. user.username = weixin_name;
  488. if (string.IsNullOrEmpty(user.head_img))
  489. {
  490. user.head_img = user.weixin_img;
  491. user.head_small_img = user.weixin_img;
  492. }
  493. await _sys_user_accountRepository.UpdateOne(user);
  494. }
  495. var bduser = await _sys_user_accountRepository.GetSingle(x => x.weixin == weixin && x.type != 2 && x.delete_flag == false);
  496. if (user != null)
  497. {
  498. user.weixin = weixin;
  499. user.weixin_name = weixin_name;
  500. user.weixin_img = weixin_img;
  501. if (string.IsNullOrEmpty(user.head_img))
  502. {
  503. user.head_img = user.weixin_img;
  504. user.head_small_img = user.weixin_img;
  505. }
  506. await _sys_user_accountRepository.UpdateOne(user);
  507. }
  508. #endregion
  509. #region JWT token生成
  510. var signingKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(_configuration["Jwt:SecretKey"].ToString()));
  511. var signingCredentials = new SigningCredentials(signingKey, SecurityAlgorithms.HmacSha256);
  512. var role = "weixin";
  513. var permissionRequirement = new PermissionRequirement(
  514. "/api/denied",
  515. ClaimTypes.Role,
  516. _configuration["Jwt:Issuer"].ToString(),
  517. _configuration["Jwt:Audience"].ToString(),
  518. signingCredentials,
  519. expiration: TimeSpan.FromDays(Convert.ToInt32(_configuration["Jwt:Expiration"]))
  520. );
  521. var claims = new Claim[] {
  522. new Claim(ClaimTypes.PrimarySid, user.id),//用户id
  523. new Claim(ClaimTypes.GroupSid,channel.ToString()),//渠道来源
  524. new Claim(ClaimTypes.Sid, user.usercode),//用户账号
  525. new Claim(ClaimTypes.Name, user.username),//用户名字
  526. new Claim(ClaimTypes.Role, ""),//角色id
  527. new Claim("RoleCode", ""),//角色code
  528. new Claim(ClaimTypes.DenyOnlySid, weixin),//微信id
  529. new Claim(ClaimTypes.Expiration,DateTime.Now.AddSeconds(permissionRequirement.Expiration.TotalSeconds).ToString())
  530. };
  531. //用户标识
  532. var identity = new ClaimsIdentity(JwtBearerDefaults.AuthenticationScheme);
  533. identity.AddClaims(claims);
  534. var jwt_token = JwtToken.BuildJwtToken(claims, permissionRequirement);
  535. #endregion
  536. await AddLogAsync(user.username, user.usercode, "登录成功", ip, channel);
  537. var result = new
  538. {
  539. username = user.username,
  540. usercode = user.usercode,
  541. token = jwt_token,
  542. type = user.type,
  543. seat_flag = user.seat_flag,
  544. group = user.group,
  545. role_name = "",
  546. role_code = "",
  547. role_id = user.role_id,
  548. dept_id = user.dept_id,
  549. team_id = user.team_id,
  550. mobile = user.mobile,
  551. head_img = user.head_img,
  552. weixin = user.weixin,
  553. weixin_name = user.weixin_name,
  554. weixin_img = user.weixin_img
  555. };
  556. return Success("登录成功!", result);
  557. }
  558. /// <summary>
  559. /// 微信绑定
  560. /// </summary>
  561. /// <param name="usercode"></param>
  562. /// <param name="openid"></param>
  563. /// <param name="channel"></param>
  564. /// <returns></returns>
  565. [AllowAnonymous]
  566. [HttpPost("wechat_bind")]
  567. public async Task<IActionResult> Wechat_Bind(string usercode, string openid, int channel = 4)
  568. {
  569. var user = await _sys_user_accountRepository.GetSingle(x => x.usercode == usercode && x.delete_flag == false);
  570. if (user != null && string.IsNullOrEmpty(user.weixin))
  571. {
  572. user.weixin = openid;
  573. var wxuser = await _sys_user_accountRepository.GetSingle(x => x.usercode == openid && x.delete_flag == false);
  574. if (wxuser != null)
  575. {
  576. user.weixin_name = wxuser.weixin_name;
  577. user.weixin_img = wxuser.weixin_img;
  578. if (user.head_img == "")
  579. {
  580. user.head_img = wxuser.weixin_img;
  581. }
  582. }
  583. bool b = await _sys_user_accountRepository.UpdateOne(user);
  584. if (b)
  585. return Success("绑定成功!");
  586. return Error("绑定失败");
  587. }
  588. else
  589. {
  590. return Error("绑定失败");
  591. }
  592. }
  593. /// <summary>
  594. /// 微信解绑
  595. /// </summary>
  596. /// <param name="usercode"></param>
  597. /// <param name="channel"></param>
  598. /// <returns></returns>
  599. [HttpPost("wechat_unbind")]
  600. public async Task<IActionResult> Wechat_UnBind(string usercode, int channel = 4)
  601. {
  602. var user = await _sys_user_accountRepository.GetSingle(x => x.usercode == usercode && x.delete_flag == false);
  603. if (user != null)
  604. {
  605. user.weixin = "";
  606. user.weixin_name = "";
  607. user.weixin_img = "";
  608. bool b = await _sys_user_accountRepository.UpdateOne(user);
  609. if (b)
  610. return Success("解绑成功!");
  611. return Error("解绑失败");
  612. }
  613. else
  614. {
  615. return Error("解绑失败");
  616. }
  617. }
  618. /// <summary>
  619. /// 存储登录日志
  620. /// </summary>
  621. /// <param name="name"></param>
  622. /// <param name="code"></param>
  623. /// <param name="log"></param>
  624. /// <param name="ip"></param>
  625. /// <param name="channel"></param>
  626. /// <returns></returns>
  627. private async Task AddLogAsync(string name, string code, string log, string ip, int channel)
  628. {
  629. var login_log = new Sys_Login_Logs()
  630. {
  631. username = name,
  632. usercode = code,
  633. result = log,
  634. login_ip = ip,
  635. channel = channel
  636. };
  637. if (!await _sys_login_logsRepository.Add(login_log))
  638. {
  639. _logger.LogError($"{code}登录日志存储异常,登录IP地址为{ip}");
  640. }
  641. }
  642. private IActionResult SaveLoginLog()
  643. {
  644. return Ok();
  645. }
  646. [HttpPost("/api/logout")]
  647. public IActionResult Logout()
  648. {
  649. return Ok();
  650. }
  651. [AllowAnonymous]
  652. [HttpGet("/api/denied")]
  653. public IActionResult Denied()
  654. {
  655. return new JsonResult(new
  656. {
  657. Status = false,
  658. Message = "你无权限访问"
  659. });
  660. }
  661. }
  662. }