using Admin.Core.Attributes; using Admin.Core.Common.Auth; using Admin.Core.Common.Extensions; using Admin.Core.Common.Helpers; using Admin.Core.Common.Output; using Admin.Core.Service.Admin.Auth; using Admin.Core.Service.Admin.Auth.Input; using Admin.Core.Service.Admin.Auth.Output; using Admin.Core.Service.Admin.LoginLog; using Admin.Core.Service.Admin.LoginLog.Input; using Admin.Core.Service.Admin.User; using Admin.Tools.Captcha; using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Mvc; using Microsoft.AspNetCore.Mvc.ModelBinding; using System; using System.Diagnostics; using System.Linq; using System.Security.Claims; using System.Threading.Tasks; namespace Admin.Core.Controllers.Admin { /// /// 授权管理 /// public class AuthController : AreaController { private readonly IUserToken _userToken; private readonly IAuthService _authService; private readonly IUserService _userService; private readonly ILoginLogService _loginLogService; private readonly ICaptcha _captcha; public AuthController( IUserToken userToken, IAuthService authService, IUserService userService, ILoginLogService loginLogService, ICaptcha captcha ) { _userToken = userToken; _authService = authService; _userService = userService; _loginLogService = loginLogService; _captcha = captcha; } /// /// 获得token /// /// /// private IResponseOutput GetToken(ResponseOutput output) { if (!output.Success) { return ResponseOutput.NotOk(output.Msg); } var user = output.Data; if (user == null) { return ResponseOutput.NotOk(); } var token = _userToken.Create(new[] { new Claim(ClaimAttributes.UserId, user.Id.ToString()), new Claim(ClaimAttributes.UserName, user.UserName), new Claim(ClaimAttributes.UserNickName, user.NickName), new Claim(ClaimAttributes.TenantId, user.TenantId.ToString()), new Claim(ClaimAttributes.TenantType, user.TenantType.ToString()), new Claim(ClaimAttributes.DataIsolationType, user.DataIsolationType.ToString()) }); return ResponseOutput.Ok(new { token }); } /// /// 获取验证码 /// /// 上次验证码键 /// [HttpGet] [AllowAnonymous] [NoOprationLog] public async Task GetVerifyCode(string lastKey) { return await _authService.GetVerifyCodeAsync(lastKey); } /// /// 获取验证数据 /// /// [HttpGet] [AllowAnonymous] [NoOprationLog] public async Task GetCaptcha() { var data = await _captcha.GetAsync(); return ResponseOutput.Ok(data); } /// /// 检查验证数据 /// /// [HttpGet] [AllowAnonymous] [NoOprationLog] public async Task CheckCaptcha([FromQuery] SlideJigsawCaptchaInput input) { var result = await _captcha.CheckAsync(input); return ResponseOutput.Result(result); } /// /// 获取密钥 /// /// [HttpGet] [AllowAnonymous] [NoOprationLog] public async Task GetPassWordEncryptKey() { return await _authService.GetPassWordEncryptKeyAsync(); } /// /// 查询用户信息 /// /// [HttpGet] [Login] public async Task GetUserInfo() { return await _authService.GetUserInfoAsync(); } /// /// 用户登录 /// 根据登录信息生成Token /// /// 登录信息 /// [HttpPost] [AllowAnonymous] [NoOprationLog] public async Task Login(AuthLoginInput input) { var sw = new Stopwatch(); sw.Start(); var res = await _authService.LoginAsync(input); sw.Stop(); #region 添加登录日志 var loginLogAddInput = new LoginLogAddInput() { CreatedUserName = input.UserName, ElapsedMilliseconds = sw.ElapsedMilliseconds, Status = res.Success, Msg = res.Msg }; ResponseOutput output = null; if (res.Success) { output = (res as ResponseOutput); var user = output.Data; loginLogAddInput.CreatedUserId = user.Id; loginLogAddInput.NickName = user.NickName; loginLogAddInput.TenantId = user.TenantId; } await _loginLogService.AddAsync(loginLogAddInput); #endregion 添加登录日志 if (!res.Success) { return res; } return GetToken(output); } /// /// 刷新Token /// 以旧换新 /// /// /// [HttpGet] [AllowAnonymous] public async Task Refresh([BindRequired] string token) { var userClaims = _userToken.Decode(token); if (userClaims == null || userClaims.Length == 0) { return ResponseOutput.NotOk(); } var refreshExpires = userClaims.FirstOrDefault(a => a.Type == ClaimAttributes.RefreshExpires)?.Value; if (refreshExpires.IsNull()) { return ResponseOutput.NotOk(); } if (refreshExpires.ToLong() <= DateTime.Now.ToTimestamp()) { return ResponseOutput.NotOk("登录信息已过期"); } var userId = userClaims.FirstOrDefault(a => a.Type == ClaimAttributes.UserId)?.Value; if (userId.IsNull()) { return ResponseOutput.NotOk("登录信息已失效"); } var output = await _userService.GetLoginUserAsync(userId.ToLong()); return GetToken(output); } } }