public async Task <ServiceResult <object> > RegisterStudentAsync(RegisterUserRequest request) { if (await _unitOfWork.UserRepository.AnyAsync(u => u.Email.ToUpperInvariant() == request.Email.ToUpperInvariant())) { return(ServiceResult <object> .Fail(EOperationResult.AlreadyExist, "User with this email already exist")); } request.Username = request.Username.ToLowerInvariant(); if (await _unitOfWork.UserRepository.IsUserExistByUsernameAsync(request.Username)) { return(ServiceResult <object> .Fail(EOperationResult.AlreadyExist, "User with this username already exist")); } string encryptedString = _encryptHelper.Encrypt(request.Email); var confirmationUrl = $"{_urlOptions.ServerUrl}/{_urlOptions.ApiVersion}/authorization/email-confirmation/{HttpUtility.UrlEncode(encryptedString)}"; var sendEmailResult = await _emailService.SendUserValidationEmailAsync(request.Email, request.Username, confirmationUrl); if (!sendEmailResult.IsSuccess) { return(ServiceResult <object> .Fail(EOperationResult.SendEmailError, $"Error while sending email with status code: {sendEmailResult.Result}.")); } var user = new User() { Email = request.Email, CreatedAtUtc = _dateHelper.GetDateTimeUtcNow(), PasswordHash = Authenticate.Hash(request.Password), Username = request.Username, RoleId = (int)ERoleType.Student, Avatar = _urlOptions.ServerUrl + DefaultImagesConstants.DefaultUserImage, CurrencyCount = TradingConstants.RegistrationUnicoinsBonus }; _unitOfWork.UserRepository.Add(user); await _unitOfWork.CommitAsync(); return(ServiceResult <object> .Ok()); }
public void Send(string message) { var xMsg = _crypto.Encrypt(message); _logger.Info($"Message Sent via FedEx: {xMsg}"); }
public VCodeCheckResponseModel VCodeCheck(VerifyInfoModel verifyInfo, string userIp) { VCodeCheckResponseModel rtnResult = new VCodeCheckResponseModel(); // 允许的偏移量(点触容错) int allowOffset = 10; // appId 效验: 这通常需要你自己根据业务实现 IAppChecker #region AppId效验 AppCheckModel appCheckResult = AppChecker.CheckAppId(verifyInfo.AppId); if (!appCheckResult.Pass) { // -6 appId 效验不通过 -> 不允许验证, 提示错误信息 rtnResult = new VCodeCheckResponseModel { code = -6, message = appCheckResult.Message }; return(rtnResult); } #endregion #region 尝试从内存中取出对应的 VCodeKey // 获取此用户会话的验证码效验 vCodeKey string cacheKeyVCodeKey = CachePrefixVCodeKey + verifyInfo.UserId; if (!_cacheHelper.Exists(cacheKeyVCodeKey)) { // 验证码无效,1.此验证码已被销毁 rtnResult = new VCodeCheckResponseModel { code = -5, message = "验证码过期, 获取新验证码" }; return(rtnResult); } string rightVCodeKey = _cacheHelper.Get <string>(cacheKeyVCodeKey); // AES解密 string vCodeKeyJsonStr = _encryptHelper.Decrypt(rightVCodeKey, _options.EncryptKey); // json -> 对象 VCodeKeyModel vCodeKeyModel = null; try { // TODO: fixed: 临时修复, 直接将全部为0的字节去除, byte[] bytes = Encoding.UTF8.GetBytes(vCodeKeyJsonStr); byte[] remove0Bytes = bytes.Where(m => m != 0).ToArray(); string remove0ByteStr = Encoding.UTF8.GetString(remove0Bytes); // 能够转换为 对象, 则说明 vCodeKey 无误, 可以使用 //vCodeKeyModel = JsonHelper.Deserialize<VCodeKeyModel>(vCodeKeyJsonStr); vCodeKeyModel = JsonHelper.Deserialize <VCodeKeyModel>(remove0ByteStr); } catch (Exception ex) { // TODO: BUG: 经加密再解密后的jsonStr,虽然看起来一样,但发生了一点改变, 导致无法转换 // '0x00' is invalid after a single JSON value. Expected end of data. LineNumber: 0 | BytePositionInLine: 110. _logHelper?.Write(ex.ToString()); } if (vCodeKeyModel == null) { // 验证码无效,被篡改导致解密失败 rtnResult.code = -3; rtnResult.message = "验证码无效, 获取新验证码"; return(rtnResult); } #endregion #region 验证码是否过期 // 验证码是否过期 bool isExpired = ((DateTimeHelper.NowTimeStamp13() - vCodeKeyModel.TS) / 1000) > _options.ExpiredSec; if (isExpired) { // 验证码过期 rtnResult.code = -4; rtnResult.message = "验证码过期, 获取新验证码"; RemoveCacheVCodeKey(verifyInfo.UserId); return(rtnResult); } #endregion #region 效验点触位置数据 // 效验点触位置数据 IList <PointPosModel> rightVCodePos = vCodeKeyModel.VCodePos; IList <PointPosModel> userVCodePos = verifyInfo.VCodePos; // 验证码是否正确 bool isPass = false; if (userVCodePos.Count != rightVCodePos.Count) { // 验证不通过 isPass = false; } else { isPass = true; for (int i = 0; i < userVCodePos.Count; i++) { int xOffset = userVCodePos[i].X - rightVCodePos[i].X; int yOffset = userVCodePos[i].Y - rightVCodePos[i].Y; // x轴偏移量 xOffset = Math.Abs(xOffset); // y轴偏移量 yOffset = Math.Abs(yOffset); // 只要有一个点的任意一个轴偏移量大于allowOffset,则验证不通过 if (xOffset > allowOffset || yOffset > allowOffset) { isPass = false; } } } #endregion #region 未通过->错误次数达到上限? if (!isPass) { // 本次没通过验证 -> 错误次数+1 vCodeKeyModel.ErrorNum++; // 错误次数是否达上限 bool isMoreThanErrorNum = vCodeKeyModel.ErrorNum > _options.AllowErrorNum; if (isMoreThanErrorNum) { // 错误 -> 2.code:-2 验证码错误 且 错误次数已达上限 -> message: 这题有点难,为你换一个试试吧 rtnResult.code = -2; rtnResult.message = "这题有点难, 为你换一个试试吧"; RemoveCacheVCodeKey(verifyInfo.UserId); return(rtnResult); } else { // 错误 -> 1.code:-1 验证码错误 且 错误次数未达上限 -> message: 点错啦,请重试 string vCodekeyJsonStrTemp = JsonHelper.Serialize(vCodeKeyModel); // AES加密 vCodekeyJsonStrTemp string vCodeKeyStrTemp = _encryptHelper.Encrypt(vCodekeyJsonStrTemp, _options.EncryptKey); // 更新 Cache 中的 vCodeKey _cacheHelper.Insert <string>(CachePrefixVCodeKey + verifyInfo.UserId, vCodeKeyStrTemp); rtnResult.code = -1; rtnResult.message = "点错啦,请重试"; return(rtnResult); } } #endregion #region 验证通过->下发ticket // 正确 -> code:0 下发票据 ticket TicketModel ticketModel = new TicketModel { IP = userIp, IsPass = true, TS = DateTimeHelper.NowTimeStamp13() }; string ticketJsonStr = JsonHelper.Serialize(ticketModel); // 对 ticketJsonStr 加密 string ticket = _encryptHelper.Encrypt(ticketJsonStr, _options.EncryptKey); // 内存中存一份ticket, 用于效验 _cacheHelper.Insert <string>(CachePrefixTicket + verifyInfo.UserId, ticket); rtnResult.code = 0; rtnResult.message = "验证通过"; rtnResult.data = new VCodeCheckResponseModel.DataModel { appId = verifyInfo.AppId, ticket = ticket }; return(rtnResult); #endregion }
public void Send(string message) { var xMsg = _crypto.Encrypt(message); _logger.Info($"Message Sent via UPS: {xMsg}"); // Extension Methods from External Library }