예제 #1
0
 private void CacheMobileValidationCodeCache(string cacheKey, MobileValidationCode mobileValidationCode)
 {
     _cache.SetJsonAsync(cacheKey, mobileValidationCode, new DistributedCacheEntryOptions
     {
         // 备注:缓存到期时间和验证码到期时间其实没有直接的关系——当然,缓存不应该比验证码到期时长短。
         SlidingExpiration = TimeSpan.FromSeconds(_mobileValidationCodeSettings.Expiration)
     }).ContinueWithOnFaultedHandleLog(_logger);
 }
예제 #2
0
        public async Task <bool> GetMobileValidationCodeAsync(GetMobileValidationCodeInput getMobileValidationCodeInput, ModelStateDictionary modelState)
        {
            if (getMobileValidationCodeInput.Type == MobileValidationCodeType.Register)
            {
                if (await _manager.IsExistsMobileAsync(getMobileValidationCodeInput.Mobile))
                {
                    modelState.AddModelError("Mobile", "手机号码已经被使用");
                    return(false);
                }
            }
            else if (getMobileValidationCodeInput.Type == MobileValidationCodeType.Login || getMobileValidationCodeInput.Type == MobileValidationCodeType.ChangeMobile)
            {
                if (!await _manager.IsExistsMobileAsync(getMobileValidationCodeInput.Mobile))
                {
                    modelState.AddModelError("Mobile", "手机号码尚未注册");
                    return(false);
                }
            }

            string validationCode       = null;
            var    cacheKey             = MobileValidationCodeCacheKeyFormat.FormatWith(getMobileValidationCodeInput.Mobile);
            var    mobileValidationCode = await _cache.GetJsonAsync <MobileValidationCode>(cacheKey);

            var now = DateTime.Now;

            if (mobileValidationCode != null)
            {
                if (now - mobileValidationCode.CreationTime < TimeSpan.FromSeconds(_mobileValidationCodeSettings.RequestInterval))
                {
                    modelState.AddModelError("Mobile", "请求过于频繁,请稍后再试");
                    return(false);
                }

                if (!mobileValidationCode.ValidationCode.IsNullOrWhiteSpace() &&
                    mobileValidationCode.Type == getMobileValidationCodeInput.Type /* 验证码用途未发生更改 */ &&
                    mobileValidationCode.ExpirationDate <= now /* 验证码没到期 */ &&
                    mobileValidationCode.VerifyTimes < mobileValidationCode.MaxVerifyTimes /* 验证码在合理使用次数内 */)
                {
                    // 继续沿用之前的验证码
                    validationCode = mobileValidationCode.ValidationCode;
                }
            }

            if (validationCode == null)
            {
                validationCode       = GenerateMobileValidationCode(_mobileValidationCodeSettings.CodeLength);
                mobileValidationCode = new MobileValidationCode
                {
                    Mobile           = getMobileValidationCodeInput.Mobile,
                    Type             = getMobileValidationCodeInput.Type,
                    ValidationCode   = validationCode,
                    ExpirationDate   = now.AddSeconds(_mobileValidationCodeSettings.Expiration),
                    MaxVerifyTimes   = _mobileValidationCodeSettings.MaxVerifyTimes,
                    VerifyTimes      = 0,
                    FinishVerifyDate = null,
                    CreationTime     = now,
                };
                await _cache.SetJsonAsync(cacheKey, mobileValidationCode, new DistributedCacheEntryOptions
                {
                    SlidingExpiration = TimeSpan.FromSeconds(_mobileValidationCodeSettings.Expiration)
                });
            }
            var sms = "{\"code\":\"" + validationCode + "\",\"time\":\"" + (_mobileValidationCodeSettings.Expiration / 60) + "\"}";

            return(await _smsSender.SendAsync(getMobileValidationCodeInput.Mobile, sms));
        }