足力健后端,使用.netcore版本,合并1个项目使用

TokenController.cs 7.3KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181
  1. using System;
  2. using System.Collections.Generic;
  3. using System.IRepositories;
  4. using System.Linq;
  5. using System.Model;
  6. using System.Security.Claims;
  7. using System.Text;
  8. using System.Threading.Tasks;
  9. using System.Common;
  10. using Microsoft.AspNetCore.Authentication.JwtBearer;
  11. using Microsoft.AspNetCore.Authorization;
  12. using Microsoft.AspNetCore.Mvc;
  13. using Microsoft.Extensions.Caching.Distributed;
  14. using Microsoft.Extensions.Configuration;
  15. using Microsoft.Extensions.Logging;
  16. using Microsoft.IdentityModel.Tokens;
  17. using SignToken;
  18. namespace TVShoppingCallCenter_ZLJ.Controllers
  19. {
  20. [Authorize]
  21. [Route("api/[controller]")]
  22. public class TokenController : BaseController
  23. {
  24. private readonly IConfiguration _configuration;
  25. private readonly IDistributedCache _cache;
  26. private readonly ISys_UserAccountRepository _sys_useraccountRepository;
  27. private readonly ISys_RoleInfoRepository _sys_roleinfoRepository;
  28. private readonly ISys_SeatGroupRepository _sys_seatgroupRepository;
  29. private readonly ISys_LoginLogsRepository _sys_login_logsRepository;
  30. public TokenController(IConfiguration configuration, IDistributedCache cache, ISys_UserAccountRepository sys_useraccountRepository, ISys_RoleInfoRepository sys_roleinfoRepository, ISys_SeatGroupRepository sys_seatgroupRepository, ISys_LoginLogsRepository sys_login_logsRepository)
  31. {
  32. _configuration = configuration;
  33. _cache = cache;
  34. _sys_useraccountRepository = sys_useraccountRepository;
  35. _sys_roleinfoRepository = sys_roleinfoRepository;
  36. _sys_seatgroupRepository = sys_seatgroupRepository;
  37. _sys_login_logsRepository = sys_login_logsRepository;
  38. }
  39. /// <summary>
  40. /// 登陆
  41. /// </summary>
  42. /// <param name="usercode"></param>
  43. /// <param name="password"></param>
  44. /// <returns></returns>
  45. [AllowAnonymous]
  46. [HttpPost("login")]
  47. public async Task<IActionResult> LoginAsync(string usercode, string password, int channel = 1, string returnUrl = null)
  48. {
  49. #region 获取ip地址
  50. var ip = IPHelper.GetIp(this.HttpContext);
  51. #endregion
  52. #region 用户信息判断及查找
  53. if (!ValidateHelper.IsAllPlumpString(usercode, password))
  54. {
  55. return Error("用户名或密码不能为空!");
  56. }
  57. var user = await _sys_useraccountRepository.GetSingle(x => x.F_UserCode == usercode && x.F_Password == password);
  58. if (user == null) { return Error("用户名或密码错误!"); }
  59. if (user.F_DeleteFlag == (int)EnumUserCountState.Delete) {
  60. await AddLogAsync(usercode, "当前账户被禁止登录访问", ip, user.F_UserId, channel);
  61. return Error("当前账户被禁止登录访问!");
  62. }
  63. #endregion
  64. #region 角色判断
  65. var roleinfo = await _sys_roleinfoRepository.GetSingle(x => x.F_RoleId == user.F_RoleId && x.F_State == (int)EnumDelState.Enabled);
  66. //查询角色 如若查询不到,反馈 不要直接反馈明显信息
  67. if (roleinfo == null)
  68. {
  69. await AddLogAsync(usercode, "无相关角色信息", ip, user.F_UserId, channel);
  70. return Error("当前用户涉嫌非法访问!");
  71. }
  72. #endregion
  73. #region 坐席组
  74. var seatgroupcode = "";
  75. var seatgroupinfo = await _sys_seatgroupRepository.GetSingle(x => x.F_ZXZID == user.F_SeartGroupID && x.F_State==(int)EnumDelState.Enabled);
  76. if (seatgroupinfo != null)
  77. seatgroupcode = seatgroupinfo.F_ZXZCode;
  78. #endregion
  79. #region JWT token生成
  80. var signingKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(_configuration["Jwt:SecretKey"].ToString()));
  81. var signingCredentials = new SigningCredentials(signingKey, SecurityAlgorithms.HmacSha256);
  82. //var role_name = roleinfo.role_name;
  83. var permissionRequirement = new PermissionRequirement(
  84. "/api/denied",
  85. ClaimTypes.Role,
  86. _configuration["Jwt:Issuer"].ToString(),
  87. _configuration["Jwt:Audience"].ToString(),
  88. signingCredentials,
  89. expiration: TimeSpan.FromDays(Convert.ToInt32(_configuration["Jwt:Expiration"]))
  90. );
  91. var claims = new Claim[] {
  92. new Claim(ClaimTypes.PrimarySid, user.F_UserId.ToString()),//用户id
  93. //new Claim(ClaimTypes.GroupSid,channel.ToString()),//渠道来源
  94. new Claim(ClaimTypes.Sid, user.F_UserCode),//用户账号
  95. new Claim(ClaimTypes.Name, user.F_UserName),//用户名字
  96. new Claim(ClaimTypes.Role, user.F_RoleId.ToString()),//角色id
  97. new Claim("RoleCode", roleinfo.F_RoleCode),//角色code
  98. new Claim(ClaimTypes.DenyOnlySid, user.F_WxOpenId),//微信id
  99. new Claim(ClaimTypes.Expiration,DateTime.Now.AddSeconds(permissionRequirement.Expiration.TotalSeconds).ToString())
  100. };
  101. //用户标识
  102. var identity = new ClaimsIdentity(JwtBearerDefaults.AuthenticationScheme);
  103. identity.AddClaims(claims);
  104. var jwt_token = JwtToken.BuildJwtToken(claims, permissionRequirement);
  105. #endregion
  106. await AddLogAsync(usercode, "登录成功", ip, user.F_UserId, channel);
  107. var result = new
  108. {
  109. username = user.F_UserName,
  110. usercode = user.F_UserCode,
  111. token = jwt_token,
  112. seat_flag = user.F_SeatFlag,
  113. group = seatgroupcode,
  114. role_name = roleinfo.F_RoleName,
  115. role_id = roleinfo.F_RoleId,
  116. role_code = roleinfo.F_RoleCode,
  117. dept_id = user.F_DeptId,
  118. mobile = user.F_Mobile,
  119. };
  120. return Success("成功", result);
  121. }
  122. [HttpPost("/api/logout")]
  123. public IActionResult Logout()
  124. {
  125. return Ok();
  126. }
  127. [AllowAnonymous]
  128. [HttpGet("/api/denied")]
  129. public IActionResult Denied()
  130. {
  131. return new JsonResult(new
  132. {
  133. Status = false,
  134. Message = "无权限访问"
  135. });
  136. }
  137. #region 私有方法
  138. /// <summary>
  139. /// 存储登录日志
  140. /// </summary>
  141. /// <param name="code"></param>
  142. /// <param name="log"></param>
  143. /// <param name="ip"></param>
  144. /// <param name="userid"></param>
  145. /// <returns></returns>
  146. private async Task AddLogAsync(string code, string log, string ip,int userid, int channel)
  147. {
  148. var login_log = new T_Sys_LoginLogs()
  149. {
  150. F_LoginCode = code,
  151. F_LoginIP = ip,
  152. F_LoginId=userid,
  153. F_State=0,
  154. F_Result= log,
  155. F_LoginDate = DateTime.Now,
  156. F_Channel=channel
  157. };
  158. if (await _sys_login_logsRepository.Add(login_log)<=0)
  159. {
  160. LogDefault.Error($"{code}登录日志存储异常,登录IP地址为{ip}");
  161. }
  162. }
  163. #endregion
  164. }
  165. }