Exemple #1
0
        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);
        }
Exemple #2
0
        /// <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);
            }
        }
Exemple #3
0
        /// <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);
        }
Exemple #4
0
 /// <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"));
 }
Exemple #5
0
        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);
        }