交流QQ号:555913397
有什么问题可以加群大家一起交流
上一章讲解了如何添加短信验证码登录,这一章给大家讲讲如何用"手机号"加"密码"登录,多的不说了,上代码.
在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
);
}
这就是添加手机号登录的代码,添加的相关的其他方法,参照手机验证码登录里面的代码.