public async Task <ResponseApi> Logout() { AdminInfo admin = GetAdminInfo(); if (base.RedisCache.RemoveKey(admin.Token)) { base.Logger.LogInformation($"该账户{admin.Account}退出成功,删除token {admin.Token}成功"); // return await Task.FromResult(new Utility.Response() { Message = "退出成功!", Code = (int)Code.退出成功 }); } else { base.Logger.LogWarning($"该账户{admin.Account}登录退出失败,删除token {admin.Token}失败"); ResponseApi response = ResponseApi.CreateError(GetLanguage()); return(await Task.FromResult(response)); } if (RedisCache.RemoveHash("accounts", admin.Account)) { base.Logger.LogInformation($"该账户{admin.Account}退出成功,该账户{admin.Account}缓存删除成功,token {admin.Token}"); ResponseApi response = ResponseApi.Create(GetLanguage(), Code.LogoutSuccess); return(await Task.FromResult(response)); } else { base.Logger.LogWarning($"登录退出失败,该账户{admin.Account}缓存删除失败,token {admin.Token}"); ResponseApi response = ResponseApi.CreateError(GetLanguage()); return(await Task.FromResult(response)); } }
public async Task <ResponseApi> Login(string returnUrl, [FromForm] /*[FromBody]*/ LoginViewModel login) { if (Request.ContentType.Contains("application/json")) { using (System.IO.StreamReader reader = new System.IO.StreamReader(Request.Body)) { // Ref(ref login, reader.ReadToEnd()); Ref(ref login, reader.ReadToEndAsync().Result);//类库影响 } } else if (Request.ContentType.Contains("text/xml")) { using System.IO.StreamReader reader = new System.IO.StreamReader(Request.Body); Type t = typeof(LoginViewModel); XmlSerializer serializer = new XmlSerializer(t); login = serializer.Deserialize(reader) as LoginViewModel; } //base.ActionParam(HttpContext.Request,ref login);//无效 作用域可能 绑定模型失败 var error = ValidateHelper.ValidateError(typeof(LoginViewModel), login); if (error != null) { return(await Task.FromResult(error)); } login.Password = login.Password.Sha1(); var admin = UnitWork.FindSingle <AdminInfo>(it => (it.Account == login.Account || it.Email == login.Account || it.Phone == login.Account) && it.Password == login.Password); if (admin == null) { ResponseApi response = ResponseApi.Create(GetLanguage(), Code.LoginFail, false); return(await Task.FromResult(response)); } else { Logger.LogInformation("登录成功!"); var date = DateTime.Now; var token = $"{admin.Account}{admin.Password}{date.ToString("yyyyMMddHHmmssfff")}".Sha1(); string key = $"{admin.Account}_{RandomHelper.OrderId}".AesEncrypt(Core.AesKey, Core.AesIv); string ip = HttpContext.Connection.RemoteIpAddress.ToString(); admin.LoginIp = ip; admin.LoginIps = admin.LoginIps ?? new HashSet <string>(50); admin.LoginIps.Add(ip); admin.Token = token; admin.LoginDate = date; admin.ExpressIn = 24 * 60 * 60; UnitWork.Update(admin); var value = RedisCache.GetHashValue("accounts", admin.Account); if (!string.IsNullOrEmpty(value)) { Logger.LogInformation($"该账户{admin.Account}登录成功,之前token信息缓存过,目前移除之前token信息!"); if (RedisCache.RemoveHash("accounts", admin.Account)) { Logger.LogWarning($"该账户{admin.Account}之前已登录过,缓存未过期,移除成功,移除token为:{value}"); } else { Logger.LogInformation($"该账户{admin.Account}之前已登录过,缓存未过期,移除失败,移除token为:{value}"); } } else { Logger.LogInformation($"该账户{admin.Account}登录成功,之前token {token}未缓存过或过期!"); } string tokenJson = admin.ToJson(); //var cache = HttpContext.RequestServices.GetService<IDistributedCache>(); //cache.SetString(token, tokenJson, new DistributedCacheEntryOptions() { AbsoluteExpiration = DateTimeOffset.Now.AddHours(24) }); if (base.RedisCache.AddString(token, tokenJson, date.AddHours(24))) { base.Logger.LogInformation($"该账户{admin.Account}登录成功,token {token}缓存成功,token信息为:{tokenJson}"); } else { base.Logger.LogWarning($"该账户{admin.Account}登录成功,token {token}缓存失败,token信息为:{tokenJson}"); ResponseApi response = ResponseApi.CreateError(GetLanguage()); return(await Task.FromResult(response)); } if (base.RedisCache.AddHash("accounts", admin.Account, token)) { base.Logger.LogInformation($"该账户{admin.Account}登录成功,缓存token {token}成功,用于移除未过期的token信息"); //var data = base.Cache.Get<AdminInfo>(admin.Token); //if (data == null) //{ // base.Cache.Set<AdminInfo>(admin.Token, admin, DateTimeOffset.Now.AddHours(24)); //} base.Cache.Set <AdminInfo>(admin.Token, admin, DateTimeOffset.Now.AddHours(24)); Response.Headers.Add("token", token.AesEncrypt(Core.AesKey, Core.AesIv)); Response.Headers.Add("id", admin.Account); Response.Headers.Add("key", key); HttpContext.Response.Cookies.Append("token", token, new CookieOptions() { SameSite = SameSiteMode.Lax, IsEssential = true }); HttpContext.Response.Cookies.Append("userid", admin.Account.AesEncrypt(Core.AesKey, Core.AesIv), new CookieOptions() { SameSite = SameSiteMode.Lax, IsEssential = true }); HttpContext.Response.Cookies.Append("k", key.AesEncrypt(Core.AesKey, Core.AesIv), new CookieOptions() { SameSite = SameSiteMode.Lax, IsEssential = true }); ResponseApi response = ResponseApi.Create(GetLanguage(), Code.LoginSuccess); response.Data = new { Token = token, ExpressIn = 24 * 3600 }; // var claims = new List<Claim> // { // new Claim("user", admin.Account), // new Claim("role", "Member") // }; //await HttpContext.SignInAsync(CookieAuthenticationDefaults.AuthenticationScheme, new ClaimsPrincipal(new ClaimsIdentity(claims, "Cookies", "user", "role"))); return(await Task.FromResult(response)); } else { Logger.LogWarning($"该账户{admin.Account}登录成功,缓存token {token}失败"); ResponseApi response = ResponseApi.CreateError(GetLanguage()); return(await Task.FromResult(response)); } } }