AbpZero双重认证之短信的坑

一、什么是双重认证

所谓双重认证简单来说就是除了用户名密码方式外,还额外增加了一道登录屏障。登录时先输入用户名和密码,正确后会向邮箱或手机号发送一个验证码(取决于您采用何种方式,甚至可以采用银行的电子KEY啥的),输入的验证码如果正确的话,才可以登录系统。

二、AbpZero中使用双重认证特别需要注意的地方

1.发送的内容中没有验证码!

AbpZero项目中AbpUserManager类的RegisterTwoFactorProviders方法主要用于指定可用的验证信息发送提供程序,该方法中定义了发送信息的内容,信息内容从语言包中读取,可是在语言包中并没有该项!

所以需要在语言包文件中Localization/XX/XX-zh-CN.xml中添加相应的语言项,需要注意的是语言项中的内容一定要添加占位符!不然发送的内容中是没有验证码的

2.如何使用短信发送验证码?

1.后台需要开启双重认证,使用手机号验证这个就不说了

2.需要在项目中定义一个类来实现IIdentityMessageService接口,重写SendAsync方法来实现信息发送

    /// <summary>
    /// 发送信息验证码
    /// </summary>
    public class IdentitySmsMessageService : IIdentityMessageService, ITransientDependency
    {
        public ILogger Logger { get; set; }

        private readonly ISmsSender _iSMSSender;

        public IdentitySmsMessageService(ISmsSender iSMSSender)
        {
            Logger = NullLogger.Instance;
            _iSMSSender = iSMSSender;
        }

        public async Task SendAsync(IdentityMessage message)
        {
            /*
            //TODO: Implement this service to send SMS to users. This is used by UserManager (ASP.NET Identity) on two factor auth.
            Logger.Warn("Sending SMS is not implemented! Message content:");
            Logger.Warn("Destination : " + message.Destination);
            Logger.Warn("Subject     : " + message.Subject);
            Logger.Warn("Body        : " + message.Body);
            */
            var msg = new SmsMessage();
            msg.Mobile = message.Destination;
            msg.Content = message.Body;
            await _iSMSSender.SendAsync(msg);
        }
    }

3.账号必须要有手机号(PhoneNumber)且手机号是验证过的(IsPhoneNumberConfirmed),如果当前登录账号不满足这两个条件,则只能选择邮箱方式(因为邮箱在注册时是必须填写的),这个坑太深真的太深了。

三、验证码和激活邮件有效期疑问

abpzero用户管理这块是基于identity framework实现的,查了很多资料,都没有看到验证码和激活邮件的过期时间,据说identity framework才会有这功能,不得不吐槽一下,太坑了。。。

原文地址:https://www.cnblogs.com/94pm/p/6801347.html