Abp Core adds mobile login function

Communication QQ number: 555913397
If you have any questions, you can join the group to communicate with everyone

The previous chapter explained how to add SMS verification code to log in. This chapter will tell you how to log in with "mobile phone number" and "password". I won't say more, just add the code.

在Core/Authorization/LoginManager.cs

        /// <summary>
        /// 手机号登录
        /// </summary>
        /// <param name="phoneNumber">手机号</param>
        /// <param name="plainPassword">密码</param>
        /// <param name="tenancyName">租户名</param>
        /// <param name="shouldLockout">锁定</param>
        /// <returns></returns>
        [UnitOfWork]
        public virtual async Task<AbpLoginResult<Tenant, User>> LoginByMobileAsync(string phoneNumber, string plainPassword, string tenancyName = null, bool shouldLockout = true)
        {
            var result = await LoginByMobileAsyncInternal(phoneNumber, plainPassword, tenancyName, shouldLockout);
            await SaveLoginAttempt(result, tenancyName, phoneNumber);
            return result;
        }
        /// <summary>
        /// 手机号登录内部方法
        /// </summary>
        /// <param name="phoneNumber">手机号码</param>
        /// <param name="plainPassword">密码</param>
        /// <param name="tenancyName">租户名</param>
        /// <param name="shouldLockout">是否锁定</param>
        /// <returns></returns>
        protected virtual async Task<AbpLoginResult<Tenant, User>> LoginByMobileAsyncInternal(string phoneNumber, string plainPassword, string tenancyName, bool shouldLockout)
        {
            if (phoneNumber.IsNullOrEmpty())
            {
                throw new ArgumentNullException(nameof(phoneNumber));
            }
            if (plainPassword.IsNullOrEmpty())
            {
                throw new ArgumentNullException(nameof(plainPassword));
            }
            //Get and check tenant
            Tenant tenant = null;
            using (UnitOfWorkManager.Current.SetTenantId(null))
            {
                if (!MultiTenancyConfig.IsEnabled)
                {
                    tenant = await GetDefaultTenantAsync();
                }
                else if (!string.IsNullOrWhiteSpace(tenancyName))
                {
                    tenant = await TenantRepository.FirstOrDefaultAsync(t => t.TenancyName == tenancyName);
                    if (tenant == null)
                    {
                        return new AbpLoginResult<Tenant, User>(AbpLoginResultType.InvalidTenancyName);
                    }
                    if (!tenant.IsActive)
                    {
                        return new AbpLoginResult<Tenant, User>(AbpLoginResultType.TenantIsNotActive, tenant);
                    }
                }
            }
            var tenantId = tenant == null ? (int?)null : tenant.Id;
            using (UnitOfWorkManager.Current.SetTenantId(tenantId))
            {
                await UserManager.InitializeOptionsAsync(tenantId);
                var loggedInFromExternalSource = false; 
                var user = await _userStore.FindByPhoneNumberAsync(tenantId, phoneNumber);
                if (user == null)
                {
                    return new AbpLoginResult<Tenant, User>(AbpLoginResultType.InvalidUserNameOrEmailAddress, tenant);
                }
                if (await UserManager.IsLockedOutAsync(user))
                {
                    return new AbpLoginResult<Tenant, User>(AbpLoginResultType.LockedOut, tenant, user);
                }
                if (!loggedInFromExternalSource)
                {
                    if (!await UserManager.CheckPasswordAsync(user, plainPassword))
                    {
                        if (shouldLockout)
                        {
                            if (await TryLockOutAsync(tenantId, user.Id))
                            {
                                return new AbpLoginResult<Tenant, User>(AbpLoginResultType.LockedOut, tenant, user);
                            }
                        }
                        return new AbpLoginResult<Tenant, User>(AbpLoginResultType.InvalidPassword, tenant, user);
                    }
                    await UserManager.ResetAccessFailedCountAsync(user);
                }
                return await CreateLoginByMobileResultAsync(user, tenant);
            }
        }
        /// <summary>
        /// 创建手机号登陆结果
        /// </summary>
        /// <param name="user">用户</param>
        /// <param name="tenant">租户</param>
        /// <returns></returns>
        protected virtual async Task<AbpLoginResult<Tenant, User>> CreateLoginByMobileResultAsync(User user,
            Tenant tenant = null)
        {
            //用户未激活
            if (!user.IsActive)
                //返回用户未激活
                return new AbpLoginResult<Tenant, User>(AbpLoginResultType.UserIsNotActive, tenant, user);
            //用户手机号未认证
            if (!user.IsPhoneNumberConfirmed)
                //返回用户手机号未认证
                return new AbpLoginResult<Tenant, User>(AbpLoginResultType.UserPhoneNumberIsNotConfirmed, tenant, user);
            user.LastLoginTime = Clock.Now;
            //更新用户
            await _userManager.UpdateAsync(user);
            await _unitOfWorkManager.Current.SaveChangesAsync();
            var principal = await _claimsPrincipalFactory.CreateAsync(user);
            return new AbpLoginResult<Tenant, User>(
                tenant,
                user,
                (ClaimsIdentity)principal.Identity
            );
        }

This is the code for adding a mobile phone number to log in, and other related methods to add, refer to the code in the mobile phone verification code login.

Guess you like

Origin http://43.154.161.224:23101/article/api/json?id=325683928&siteId=291194637