예제 #1
0
        public async Task <LoginOutput> LoginAsync([FromServices] IHttpContextAccessor httpContextAccessor, [Required] LoginInput input)
        {
            // 获取加密后的密码
            var encryptPassword = MD5Encryption.Encrypt(input.Password.Trim());

            // 判断用户名或密码是否正确
            var user = await _userRepository.FirstOrDefaultAsync(u => u.Account.Equals(input.Account) && u.Password.Equals(encryptPassword));

            _ = user ?? throw Oops.Oh(SystemErrorCodes.u1000);

            // 更新登录时间
            user.SigninedTime = DateTimeOffset.Now;

            // 映射结果
            var output = user.Adapt <LoginOutput>();

            // 生成 token
            var accessToken = output.AccessToken = JWTEncryption.Encrypt(new Dictionary <string, object>
            {
                { "UserId", user.Id },
                { "Account", user.Account }
            });

            // 生成 刷新token
            var refreshToken = JWTEncryption.GenerateRefreshToken(accessToken);

            // 设置 Swagger 自动登录
            httpContextAccessor.SigninToSwagger(accessToken);

            // 设置刷新 token
            httpContextAccessor.HttpContext.Response.Headers["x-access-token"] = refreshToken;

            return(output);
        }
예제 #2
0
        public LoginOutput Login(LoginInput input)
        {
            // 验证用户名和密码
            var user = _userRepository.FirstOrDefault(u => u.Account.Equals(input.Account) && u.Password.Equals(input.Password), false) ?? throw Oops.Oh(1000);

            var output = user.Adapt <LoginOutput>();

            // 生成 token
            var jwtSettings    = App.GetOptions <JWTSettingsOptions>();
            var datetimeOffset = DateTimeOffset.UtcNow;

            output.AccessToken = JWTEncryption.Encrypt(jwtSettings.IssuerSigningKey, new Dictionary <string, object>()
            {
                { "UserId", user.Id },       // 存储Id
                { "Account", user.Account }, // 存储用户名

                { JwtRegisteredClaimNames.Iat, datetimeOffset.ToUnixTimeSeconds() },
                { JwtRegisteredClaimNames.Nbf, datetimeOffset.ToUnixTimeSeconds() },
                { JwtRegisteredClaimNames.Exp, DateTimeOffset.UtcNow.AddSeconds(jwtSettings.ExpiredTime.Value * 60).ToUnixTimeSeconds() },
                { JwtRegisteredClaimNames.Iss, jwtSettings.ValidIssuer },
                { JwtRegisteredClaimNames.Aud, jwtSettings.ValidAudience }
            });

            // 设置 Swagger 刷新自动授权
            _httpContextAccessor.SigninToSwagger(output.AccessToken);

            return(output);
        }
예제 #3
0
        public async Task <StatusResult <string> > UserLogin(LoginInputDto dto)
        {
            var result = await _accountService.LoginAsync(dto);

            #region 添加登录日志

            #endregion
            if (!result.IsSuccess)
            {
                return(new StatusResult <string>(result.Message));
            }

            // 生成 token
            var accessToken = JWTEncryption.Encrypt(new Dictionary <string, object>()
            {
                { ClaimConst.USERID, result.Data.Id },         // 存储Id
                { ClaimConst.USERNAME, result.Data.UserName }, // 存储用户名
                { ClaimConst.USERNICKNAME, result.Data.NickName },
                { ClaimConst.QINGSHANUSERISSUPER, result.Data.IsSuper },
            });
            return(new StatusResult <string>()
            {
                Data = "Bearer " + accessToken
            });
        }
예제 #4
0
        public async Task <(string, string)> LoginAsync(AdminUserLoginCommand command)
        {
            var user = await bus.SendCommand(command);

            // 生成 token
            var accessToken = JWTEncryption.Encrypt(new Dictionary <string, object>
            {
                { userId, user.Id },
                { userName, user.UserName }
            });

            // 生成 刷新token
            var refreshToken = JWTEncryption.GenerateRefreshToken(accessToken);

            return(accessToken, refreshToken);
        }
예제 #5
0
        public LoginOutput Login(LoginInput input)
        {
            // 验证用户名和密码
            var user = _userRepository.FirstOrDefault(u => u.Account.Equals(input.Account) && u.Password.Equals(input.Password), false) ?? throw Oops.Oh(1000);

            var output = user.Adapt <LoginOutput>();

            output.AccessToken = JWTEncryption.Encrypt(new Dictionary <string, object>()
            {
                { "UserId", user.Id },       // 存储Id
                { "Account", user.Account }, // 存储用户名
            });

            // 设置 Swagger 刷新自动授权
            _httpContextAccessor.SigninToSwagger(output.AccessToken);

            return(output);
        }
예제 #6
0
        public async Task <(string, string)> LoginAsync(AdminUserLoginCommand command, CancellationToken cancellationToken = default)
        {
            var user = await adminUserService.LoginAsync(command, cancellationToken);

            // 生成 token
            var accessToken = JWTEncryption.Encrypt(new Dictionary <string, object>
            {
                { userId, user.Id },
                { userName, user.UserName }
            });

            // 生成 刷新token
            var refreshToken = JWTEncryption.GenerateRefreshToken(accessToken);

            // 设置 Swagger 自动登录
            Web.HttpContext.SigninToSwagger(accessToken);
            // 设置刷新 token
            Web.HttpContext.Response.Headers["x-access-token"] = refreshToken;

            return(accessToken, refreshToken);
        }
예제 #7
0
        public string GetToken()
        {
            var jwtSettings = App.GetOptions <JWTSettingsOptions>();

            var datetimeOffset = new DateTimeOffset(DateTime.Now);
            var token          = JWTEncryption.Encrypt(jwtSettings.IssuerSigningKey, new JObject()
            {
                { JwtRegisteredClaimNames.UniqueName, 1 },
                { JwtRegisteredClaimNames.NameId, "百小僧" },
                { JwtRegisteredClaimNames.Iat, datetimeOffset.ToUnixTimeSeconds() },
                { JwtRegisteredClaimNames.Nbf, datetimeOffset.ToUnixTimeSeconds() },
                { JwtRegisteredClaimNames.Exp, new DateTimeOffset(DateTime.Now.AddSeconds(jwtSettings.ExpiredTime.Value * 60)).ToUnixTimeSeconds() },
                { JwtRegisteredClaimNames.Iss, jwtSettings.ValidIssuer },
                { JwtRegisteredClaimNames.Aud, jwtSettings.ValidAudience }
            });

            // 设置 Swagger 刷新自动授权
            _httpContextAccessor.HttpContext.Response.Headers["access-token"] = token;

            return(token);
        }
예제 #8
0
        public LoginResponseDto Login([FromServices] IHttpContextAccessor httpContextAccessor, [FromBody] LoginRequestDto dto)
        {
            var user = _sysUserSerivce.Login(dto.Account, dto.Password);

            if (user == null)
            {
                throw Oops.Oh("用户名或者密码错误");
            }

            var response = user.Adapt <LoginResponseDto>();

            // 生成 token
            response.AccessToken = JWTEncryption.Encrypt(new Dictionary <string, object>
            {
                { "UserId", user.UserId },
                { "UserName", user.UserName },
                { "Account", user.UserName }
            });
            response.ExipreTime = DateTimeOffset.Now.AddMinutes(20).DateTime;
            // 设置 Swagger 自动登录
            httpContextAccessor.SigninToSwagger(response.AccessToken);
            return(response);
        }
예제 #9
0
        public async Task <LoginAdminOutput> PostLogin(LoginAdminInput loginAdminInput)
        {
            var admin = await _manageService.LoginAdmin(loginAdminInput.Adapt <AdminDto>());

            var output = admin.Adapt <LoginAdminOutput>();
            // 生成 token
            var jwtSettings    = App.GetOptions <JWTSettingsOptions>();
            var datetimeOffset = new DateTimeOffset(DateTime.Now);

            if (jwtSettings.ExpiredTime != null)
            {
                output.AccessToken = JWTEncryption.Encrypt(jwtSettings.IssuerSigningKey,
                                                           new Dictionary <string, object>()
                {
                    { "UserId", admin.Id }, // 存储Id
                    { "IsAdmin", true },    // 管理员登录
                    { JwtRegisteredClaimNames.Iat, datetimeOffset.ToUnixTimeSeconds() },
                    { JwtRegisteredClaimNames.Nbf, datetimeOffset.ToUnixTimeSeconds() },
                    {
                        JwtRegisteredClaimNames.Exp,
                        new DateTimeOffset(
                            DateTime.Now.AddSeconds(
                                jwtSettings.ExpiredTime.Value * 60 * 60 * 24 * 30))
                        .ToUnixTimeSeconds()
                    },
                    { JwtRegisteredClaimNames.Iss, jwtSettings.ValidIssuer },
                    { JwtRegisteredClaimNames.Aud, jwtSettings.ValidAudience }
                });
            }
            // 设置 Swagger 刷新自动授权
            if (_httpContextAccessor.HttpContext != null)
            {
                _httpContextAccessor.HttpContext.Response.Headers["access-token"] = output.AccessToken;
            }

            return(output);
        }
예제 #10
0
        public async Task <LoginOutput> PostLogin(LoginInput loginInput)
        {
            var student = await _studentService.LoginStudent(loginInput.StudentNo, loginInput.Password);

            var output = student.Adapt <LoginOutput>();

            // 生成 token
            var jwtSettings    = App.GetOptions <JWTSettingsOptions>();
            var datetimeOffset = new DateTimeOffset(DateTime.Now);

            output.AccessToken = JWTEncryption.Encrypt(jwtSettings.IssuerSigningKey, new Dictionary <string, object>()
            {
                { "UserId", student.Id },  // 存储Id
                { JwtRegisteredClaimNames.Iat, datetimeOffset.ToUnixTimeSeconds() },
                { JwtRegisteredClaimNames.Nbf, datetimeOffset.ToUnixTimeSeconds() },
                { JwtRegisteredClaimNames.Exp, new DateTimeOffset(DateTime.Now.AddSeconds(jwtSettings.ExpiredTime.Value * 60 * 60 * 24 * 30)).ToUnixTimeSeconds() },
                { JwtRegisteredClaimNames.Iss, jwtSettings.ValidIssuer },
                { JwtRegisteredClaimNames.Aud, jwtSettings.ValidAudience }
            });
            // 设置 Swagger 刷新自动授权
            _httpContextAccessor.HttpContext.Response.Headers["access-token"] = output.AccessToken;

            return(output);
        }
예제 #11
0
        public async Task <(string, string)> LoginAsync(AdminUserLoginCommand request, CancellationToken cancellationToken = default)
        {
            var user = default(AdminUserEntity);

            request.Password = Encrypt.Md5By32(request.Password);

            var loginWay = "";

            if (!Valid.IsMobileNumberSimple(request.Account))
            {
                user = await db.Context.AdminUser.Where(c => c.UserName.Equals(request.Account)).FirstOrDefaultAsync(cancellationToken);

                if (user == null)
                {
                    Failure.Error("账号不存在");
                }

                loginWay = "Mobile";
            }
            else
            {
                user = await db.Context.AdminUser.Where(c => c.Mobile.Equals(request.Account)).FirstOrDefaultAsync(cancellationToken);

                if (user == null)
                {
                    Failure.Error("手机号码不存在");
                }

                loginWay = "UserName";
            }

            if (!user.Password.Equals(request.Password))
            {
                Failure.Error("密码错误");
            }
            if (user.Status != Status.Show)
            {
                Failure.Error("您的帐号禁止登录,请与管理员联系!");
            }


            user.LoginCount   += 1;
            user.LoginLastTime = DateTime.Now;
            user.LoginLastIp   = Web.IP;

            user.LoginRecords.Add(new LoginRecordEntity
            {
                AdminId   = user.Id,
                LoginIp   = user.LoginLastIp,
                LoginTime = user.LoginLastTime,
                LoginWay  = loginWay
            });

            db.Update(user);

            // 生成 token
            var accessToken = JWTEncryption.Encrypt(new Dictionary <string, object>
            {
                { userId, user.Id },
                { userName, user.UserName }
            });

            // 生成 刷新token
            var refreshToken = JWTEncryption.GenerateRefreshToken(accessToken);

            // 设置 Swagger 自动登录
            Web.HttpContext.SigninToSwagger(accessToken);
            // 设置刷新 token
            Web.HttpContext.Response.Headers["x-access-token"] = refreshToken;

            return(accessToken, refreshToken);
        }
예제 #12
0
        public async Task <TData <OperatorInfo> > Login([FromForm] string userName, [FromForm] string password)
        {
            var obj     = new TData <OperatorInfo>();
            var userObj = await _userBLL.CheckLogin(userName, password);

            if (userObj.Tag == 1)
            {
                await _userBLL.UpdateLoginInfo(userObj.Data);

                await _operatorCache.AddCurrent(userObj.Data.ApiToken);

                obj.Data = await _operatorCache.Current(userObj.Data.ApiToken);
            }

            obj.Message = userObj.Message;

            var ip        = NetHelper.Ip;
            var browser   = NetHelper.Browser;
            var os        = NetHelper.GetOSVersion();
            var userAgent = NetHelper.UserAgent;

            var logLoginEntity = new LogLoginEntity
            {
                LogStatus = userObj.Tag == 1
                    ? OperateStatusEnum.Success.ParseToInt()
                    : OperateStatusEnum.Fail.ParseToInt(),
                Remark      = userObj.Message,
                IpAddress   = ip,
                IpLocation  = IpLocationHelper.GetIpLocation(ip),
                Browser     = browser,
                OS          = os,
                ExtraRemark = userAgent,
                CreatorId   = userObj.Data == null ? 0 : userObj.Data.Id,
                CreateTime  = DateTime.Now
            };

            await _logLoginBLL.SaveForm(logLoginEntity);

            if (userObj.Tag == 0)
            {
                return(obj);
            }

            // 生成前端的token
            // 生成 token
            var jwtSettings    = App.GetOptions <JWTSettingsOptions>();
            var datetimeOffset = DateTimeOffset.UtcNow;

            var accessToken = JWTEncryption.Encrypt(jwtSettings.IssuerSigningKey, new Dictionary <string, object>
            {
                { "UserId", userObj.Data.Id.ToString() }, // 存储Id
                { "Account", userObj.Data.UserName },     // 存储用户名
                { "ApiToken", userObj.Data.ApiToken },    // ApiToken
                { JwtRegisteredClaimNames.Iat, datetimeOffset.ToUnixTimeSeconds() },
                { JwtRegisteredClaimNames.Nbf, datetimeOffset.ToUnixTimeSeconds() },
                {
                    JwtRegisteredClaimNames.Exp,
                    DateTimeOffset.UtcNow.AddSeconds(jwtSettings.ExpiredTime.Value * 60).ToUnixTimeSeconds()
                },
                { JwtRegisteredClaimNames.Iss, jwtSettings.ValidIssuer },
                { JwtRegisteredClaimNames.Aud, jwtSettings.ValidAudience }
            });

            // 覆盖apitoken,因为前端需要的是jwt生成的token,而缓存使用的是数据库的apitoken字段
            obj.Data.JwtToken = accessToken;

            obj.Tag = userObj.Tag;

            var claims = new List <Claim>
            {
                new Claim(ClaimTypes.Name, userObj.Data.UserName),
                new Claim("ApiToken", userObj.Data.ApiToken),
            };

            var claimsIdentity = new ClaimsIdentity(
                claims, CookieAuthenticationDefaults.AuthenticationScheme);

            var authProperties = new AuthenticationProperties();
            await NetHelper.HttpContext.SignInAsync(
                CookieAuthenticationDefaults.AuthenticationScheme,
                new ClaimsPrincipal(claimsIdentity),
                authProperties);

            return(obj);
        }