public async Task LogoutAsync() { var userCode = _workContext.GetUserCode(); if (userCode == Guid.Empty) { return; } var userAgent = NetworkExtension.GetUserAgent(_httpContextAccessor.HttpContext.Request); var localIpAddress = NetworkExtension.GetLocalIpAddress(_httpContextAccessor.HttpContext.Request).ToString(); var remoteIpAddress = NetworkExtension.GetRemoteIpAddress(_httpContextAccessor.HttpContext.Request).ToString(); var repoToken = _uow.GetRepository <ITokenRepository>(); var token = await repoToken.GetByUserAsync(userCode, userAgent, localIpAddress, remoteIpAddress); if (token == null) { return; } await _cache.RemoveAsync($"TokenInfos:{token.Id}"); repoToken.Delete(token); await _uow.CommitAsync(); }
public override async Task Init() { await base.Init(); NetworkExtension.Clear(); try { var remote = await GetRemoteExtensionList(); foreach (var item in remote) { NetworkExtension.Add(item); } var copy = Extensions.ToList(); foreach (var manifest in copy) { var update = remote.FirstOrDefault(it => it.Name == manifest.Name && it.Version != manifest.Version); if (update != null) { await InstallExtension(update); } } } catch { // ignored } }
private async Task <TokenInfo> GetTokenAsync(Guid userCode) { var userAgent = NetworkExtension.GetUserAgent(_httpContextAccessor.HttpContext.Request); var localIpAddress = NetworkExtension.GetLocalIpAddress(_httpContextAccessor.HttpContext.Request).ToString(); var remoteIpAddress = NetworkExtension.GetRemoteIpAddress(_httpContextAccessor.HttpContext.Request).ToString(); TokenInfo token = null; //Lấy token từ cache theo IdUser var bytes = await _cache.GetAsync($"Sessions:{userCode}"); if (bytes != null) { var tokenCodes = JsonConvert.DeserializeObject <List <Guid> >(Encoding.UTF8.GetString(bytes)); foreach (var tokenCode in tokenCodes) { bytes = await _cache.GetAsync($"TokenInfos:{tokenCode}"); if (bytes != null) { var tokenInfo = JsonConvert.DeserializeObject <TokenInfo>(Encoding.UTF8.GetString(bytes)); if (tokenInfo.UserAgent == userAgent && tokenInfo.LocalIpAddress == localIpAddress && tokenInfo.PublicIpAddress == remoteIpAddress) { return(tokenInfo); } } } } //Lấy token từ DB còn sử dụng dc theo IdUser if (token == null) { var repoToken = _uow.GetRepository <ITokenRepository>(); var tokens = await repoToken.GetUnexpiredTokenByUserAsync(userCode); token = tokens.FirstOrDefault(x => x.UserAgent == userAgent && x.LocalIpAddress == localIpAddress && x.PublicIpAddress == remoteIpAddress); if (token == null) { return(null); } var idTokens = tokens.Select(x => x.Code).ToList(); await _cache.SetAsync($"Sessions:{userCode}", Encoding.UTF8.GetBytes(JsonConvert.SerializeObject(idTokens))); var cacheOption = new DistributedCacheEntryOptions(); cacheOption.AbsoluteExpiration = token.ExpireAt; await _cache.SetAsync($"TokenInfos:{token.Code}", Encoding.UTF8.GetBytes(JsonConvert.SerializeObject(token)), cacheOption); } return(token); }
/// <summary> /// 登录 /// </summary> /// <param name="loginId">登录名</param> /// <param name="password">密码</param> /// <param name="clientId">客户端Id</param> /// <returns>登录信息</returns> public LoginInfo Login(string loginId, string password, string clientId = null) { //生成公钥 Guid publicKey = Guid.NewGuid(); //生成登录信息 LoginInfo loginInfo = new LoginInfo(loginId, CommonConstants.AdminLoginId, publicKey); loginInfo.ClientId = NetworkExtension.GetLocalMacAddress(); //以公钥为键,登录信息为值,存入分布式缓存 CacheMediator.Set(publicKey.ToString(), loginInfo, DateTime.Now.AddMinutes(20)); return(loginInfo); }
public void Login(string loginId, string password, string validCode) { #region # 校验验证码 string currentValidCode = MvcExtension.GetValidCode(); if (currentValidCode != validCode) { //清空验证码 MvcExtension.ClearValidCode(); throw new InvalidOperationException("验证码错误!"); } #endregion //清空验证码 MvcExtension.ClearValidCode(); //验证登录 string clientId = NetworkExtension.GetLocalMacAddress(); LoginInfo loginInfo = this._authenticationContract.Login(loginId, password, clientId); base.HttpContext.Session[GlobalSetting.ApplicationId] = loginInfo; }
public async Task <TokenModel> LoginAsync(Guid tenantCode, LoginModel model) { model.UserName = model.UserName.ToUpper(); var repoUser = _uow.GetRepository <IUserRepository>(); var user = await repoUser.FindUserByUsernameAsync(tenantCode, model.UserName); if (user == null) { throw new Exception("Tài khoản hoặc mật khẩu không đúng"); } var account = await _userManager.FindByIdAsync(user.Id.ToString()); var result = await _signInManager.CheckPasswordSignInAsync(account, model.Password, true); if (result.IsLockedOut) { throw new Exception("Tài khoản bị khóa"); } if (!result.Succeeded) { throw new Exception("Tài khoản hoặc mật khẩu không đúng"); } //TODO: Xóa các Token đã hết hạn => Đưa vào BackgroundJob //var expired = tokenInfos.Where(x => x.ExpireAtUtc <= DateTime.UtcNow); //if (expired.Any()) //{ // repoToken.DeleteRange(expired); // _uowCore.SaveChanges(); //} SessionModel session; var token = await GetTokenAsync(user.Id); if (token != null) { session = JsonConvert.DeserializeObject <SessionModel>(token.Metadata); } else { var expireIn = TimeSpan.FromDays(1); var tokenCode = Guid.NewGuid(); var expireAt = DateTime.Now.Add(expireIn); var expireAtUtc = DateTime.UtcNow.Add(expireIn); var claims = new List <Claim>(); claims.Add(new Claim(JwtRegisteredClaimNames.Jti, tokenCode.ToString())); claims.Add(new Claim(ClaimTypes.Sid, user.Id.ToString())); claims.Add(new Claim(ClaimTypes.GroupSid, tenantCode.ToString())); var jwt = new JwtSecurityToken( claims: claims, expires: expireAt, signingCredentials: new SigningCredentials(new SymmetricSecurityKey(Encoding.ASCII.GetBytes(_options.SecretKey)), SecurityAlgorithms.HmacSha256)); var accessToken = new JwtSecurityTokenHandler().WriteToken(jwt); session = new SessionModel { IdUser = user.Id, UserName = user.UserName, PhoneNumber = user.PhoneNumber, Email = user.Email, CreatedAt = user.CreatedAt, UserInfo = await GetInfoAsync(user.Id), TenantInfo = await GetTenantInfoAsync(user.TenantCode), Claims = await GetClaimsAsync(user.Id) }; token = new TokenInfo { AccessToken = accessToken, CreatedAt = DateTime.Now, CreatedAtUtc = DateTime.UtcNow, ExpireAt = expireAt, ExpireAtUtc = expireAtUtc, Code = tokenCode, IdUser = user.Id, LocalIpAddress = NetworkExtension.GetLocalIpAddress(_httpContextAccessor.HttpContext.Request).ToString(), PublicIpAddress = NetworkExtension.GetRemoteIpAddress(_httpContextAccessor.HttpContext.Request).ToString(), Metadata = JsonConvert.SerializeObject(session), RefreshToken = null, Source = "Application", TimeToLife = expireIn.TotalMinutes, UserAgent = NetworkExtension.GetUserAgent(_httpContextAccessor.HttpContext.Request), TenantCode = tenantCode }; var repoToken = _uow.GetRepository <ITokenRepository>(); await repoToken.InsertAsync(token); await _uow.CommitAsync(); } return(new TokenModel { AccessToken = token.AccessToken, ExpireIn = (token.ExpireAt - DateTime.Now).TotalMinutes, ExpireAt = token.ExpireAt, Timezone = TimeZoneInfo.Local.GetUtcOffset(DateTime.Now).TotalHours, //RefreshToken = account.SecurityStamp, }); }
public void TestGetIps() { IList <string> ips = NetworkExtension.GetIPs(); Trace.WriteLine(ips); }
public void TestGetMacs() { IList <string> macs = NetworkExtension.GetMacs(); Trace.WriteLine(macs); }