Example #1
0
        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));
            }
        }
Example #2
0
        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));
                }
            }
        }