public async Task <string> VerifyEmailAuthCode(string mail, int codeType, string agent, string code) { if (!Enum.IsDefined(typeof(EmailAuthCodeType), codeType)) { Enforce.Throw(new FrontInputValidateErrorException("验证码邮件类型错误")); } EmailAuthCodeType mailCodeType = (EmailAuthCodeType)Enum.ToObject(typeof(EmailAuthCodeType), codeType); string emailCodeRedisKey = this.generateEmailCodeKey(mail, mailCodeType); var authCode = await _database.StringGetAsync(emailCodeRedisKey); if (authCode == code.ToLower()) { //提交token string token = this.generateToken(agent); var status = await _database.StringSetAsync(this.generateSubmitTokenKey(mail, mailCodeType), token, TimeSpan.FromMinutes(10)); if (status) { _database.KeyDeleteAsync(emailCodeRedisKey); _database.KeyDeleteAsync(this.generateReSendMailTokenKey(mail, mailCodeType)); return(token); } } return(string.Empty); }
/// <summary> /// 检验重发Token /// </summary> /// <param name="mail"></param> /// <param name="codeType"></param> /// <param name="agent"></param> /// <param name="reSendToken"></param> /// <returns></returns> private async Task <bool> verifyReSendAuthMailToken(string mail, EmailAuthCodeType codeType, string agent, string reSendToken) { string redisKey = this.generateReSendMailTokenKey(mail, codeType); var token = await _database.StringGetAsync(redisKey); if (reSendToken.Equals(token)) { var tokenContentModel = _tokenSecurity.decrypt <TokenContentModel>(token); return(tokenContentModel != null && tokenContentModel.agent.Equals(agent) && (DateTime.Now.ToTimeStamp() - tokenContentModel.timestamp) > 10 * 1000); } else { return(false); } }
/// <summary> /// 校验提交Token /// </summary> /// <param name="codeType"></param> /// <param name="mail"></param> /// <param name="token"></param> /// <param name="response"></param> /// <returns></returns> private async Task <bool> checkSubmitToken(EmailAuthCodeType codeType, string mail, string token, string agent) { bool result = true; if (string.IsNullOrEmpty(token)) { Enforce.Throw(new FrontInputValidateErrorException("提交Token不能为空")); } string redisKey = this.generateSubmitTokenKey(mail, codeType); var submitToken = await _database.StringGetAsync(redisKey); if (submitToken.Equals(token)) { var tokenContentModel = _tokenSecurity.decrypt <TokenContentModel>(submitToken); result = tokenContentModel != null && tokenContentModel.agent.Equals(agent); } else { result = false; } return(result); }
/// <summary> /// 提交Token的redis key /// </summary> /// <param name="mail"></param> /// <param name="codeType"></param> /// <returns></returns> private string generateSubmitTokenKey(string mail, EmailAuthCodeType codeType) { mail = string.IsNullOrEmpty(mail) ? mail : mail.ToLower(); return(string.Concat(mail, ":", codeType.ToString(), ":", "submitToken")); }
public async Task <string> SendAuthMail(string reSendEmailToken, string identity, string code, string mail, int codeType, string agent) { if (!Enum.IsDefined(typeof(EmailAuthCodeType), codeType)) { Enforce.Throw(new FrontInputValidateErrorException("验证码邮件类型错误")); } EmailAuthCodeType mailCodeType = (EmailAuthCodeType)Enum.ToObject(typeof(EmailAuthCodeType), codeType); //判断是否包含重发token if (string.IsNullOrEmpty(reSendEmailToken)) { if (string.IsNullOrEmpty(identity)) { Enforce.Throw(new FrontInputValidateErrorException("验证码identity不能为空")); } //去认证验证码,验证码通过才能发邮件 var verifyAuthCodeResult = await this.verifyAuthCode(identity, code); if (!verifyAuthCodeResult) { Enforce.Throw(new LogicErrorException("验证码错误")); } } else { //验证重发token,重发token通过才会发邮件 bool verifyReSendMailToken = await this.verifyReSendAuthMailToken(mail, mailCodeType, agent, reSendEmailToken); if (!verifyReSendMailToken) { Enforce.Throw(new LogicErrorException("重发邮件失败")); } } //验证码 var authCode = AuthCode.CreateAuthCode(100, 40, ImageFormat.Png); var setCodeStatus = await _database.StringSetAsync(this.generateEmailCodeKey(mail, mailCodeType), authCode.Code.ToLower(), TimeSpan.FromMinutes(10)); //重发token string token = this.generateToken(agent); var setTokenStatus = await _database.StringSetAsync(this.generateReSendMailTokenKey(mail, mailCodeType), token, TimeSpan.FromMinutes(20)); if (setCodeStatus && setTokenStatus) { //异步发送邮件 //_mailService.SendCodeMailAsync(mail, authCode.Code); //_mailService.SendMailAsync(mail, // _mailConfig.CodeContent.Subject.Text, // string.Format(_mailConfig.CodeContent.Body.Text, authCode.Code), true); //Todo:后续需要优化 _mailService.SendMailAsync(mail, _mailConfig.CodeContent.Subject.Text, _templateHelper.GenerateContent(_mailConfig.CodeContent.Body.Text, "codeContent", new { Code = authCode.Code }) , true); return(token); } return(string.Empty); }