private void CacheMobileValidationCodeCache(string cacheKey, MobileValidationCode mobileValidationCode) { _cache.SetJsonAsync(cacheKey, mobileValidationCode, new DistributedCacheEntryOptions { // 备注:缓存到期时间和验证码到期时间其实没有直接的关系——当然,缓存不应该比验证码到期时长短。 SlidingExpiration = TimeSpan.FromSeconds(_mobileValidationCodeSettings.Expiration) }).ContinueWithOnFaultedHandleLog(_logger); }
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)); }