abp重构登录
a、Core层 Authorization.Users.UserStore.cs
public class UserStore : AbpUserStore{ private readonly IRepository long> _userRepository; public UserStore( IUnitOfWorkManager unitOfWorkManager, IRepository long> userRepository, IRepository roleRepository, IAsyncQueryableExecuter asyncQueryableExecuter, IRepository long> userRoleRepository, IRepository long> userLoginRepository, IRepository long> userClaimRepository, IRepository long> userPermissionSettingRepository, IRepository long> userOrganizationUnitRepository, IRepository long> organizationUnitRoleRepository) : base( unitOfWorkManager, userRepository, roleRepository, asyncQueryableExecuter, userRoleRepository, userLoginRepository, userClaimRepository, userPermissionSettingRepository, userOrganizationUnitRepository, organizationUnitRoleRepository) { _userRepository = userRepository; } /// /// 根据账号获取用户 /// /// /// public virtual async Task FindByAccountAsync(string account) { account = account.ToLower(); return await _userRepository.FirstOrDefaultAsync( user => user.UserName.ToLower() == account ); } }
b、Core层 Authorization.LogInManager.cs
public class LogInManager : AbpLogInManager{ private readonly UserStore _userStore; private readonly AbpUserManager _userManager; public LogInManager( UserManager userManager, IMultiTenancyConfig multiTenancyConfig, IRepository tenantRepository, IUnitOfWorkManager unitOfWorkManager, ISettingManager settingManager, IRepository long> userLoginAttemptRepository, IUserManagementConfig userManagementConfig, IIocResolver iocResolver, IPasswordHasher passwordHasher, RoleManager roleManager, UserClaimsPrincipalFactory claimsPrincipalFactory, UserStore userStore) : base( userManager, multiTenancyConfig, tenantRepository, unitOfWorkManager, settingManager, userLoginAttemptRepository, userManagementConfig, iocResolver, passwordHasher, roleManager, claimsPrincipalFactory) { _userStore = userStore; _userManager = userManager; } /// /// 自定义登录 /// /// 账号、手机号、身份证号 /// 明文密码 /// [UnitOfWork] public virtual async Task > LoginCustomAsync(string account, string password) { var result = await LoginCustomAsyncInternal(account, password); //保存用户尝试登录的记录 await SaveLoginAttemptAsync(result, null, account); return result; } protected virtual async Task > LoginCustomAsyncInternal(string account, string password) { if (account.IsNullOrEmpty() || password.IsNullOrEmpty()) { throw new ArgumentException("account or password"); } //不启用租户,获取默认租户 Tenant tenant = await GetDefaultTenantAsync(); int? tenantId = tenant?.Id; using (UnitOfWorkManager.Current.SetTenantId(tenantId)) { //根据用户名获取用户信息 var user = await _userStore.FindByAccountAsync(account); if (user == null) { return new AbpLoginResult (AbpLoginResultType.UnknownExternalLogin, tenant); } //验证用户的密码是否正确 var verificationResult = _userManager.PasswordHasher.VerifyHashedPassword(user, user.Password, password); if (verificationResult != PasswordVerificationResult.Success) { if (await TryLockOutAsync(tenantId, user.Id)) { return new AbpLoginResult (AbpLoginResultType.LockedOut, tenant, user); } return new AbpLoginResult (AbpLoginResultType.InvalidPassword, tenant, user); } //重置用户登录失败次数 await _userManager.ResetAccessFailedCountAsync(user); //生成登录结果 return await CreateLoginResultAsync(user, tenant); } } }
c、Web.Core层
添加方法:
////// 自定义登录 /// /// 账号、身份证、手机号 /// /// private async Task > GetCustomLoginResultAsync(string userName, string password) { var loginResult = await _logInManager.LoginCustomAsync(userName, password); switch (loginResult.Result) { case AbpLoginResultType.Success: return loginResult; default: throw _abpLoginResultTypeHelper.CreateExceptionForFailedLoginAttempt(loginResult.Result, userName, null); } }
重构方法:
[HttpPost] public async TaskAuthenticate([FromBody] AuthenticateModel model) { //var loginResult = await GetLoginResultAsync( // model.UserNameOrEmailAddress, // model.Password, // GetTenancyNameOrNull() //); //自定义登录获取结果 var loginResult = await GetCustomLoginResultAsync( model.UserNameOrEmailAddress, model.Password ); var accessToken = CreateAccessToken(CreateJwtClaims(loginResult.Identity)); return new AuthenticateResultModel { AccessToken = accessToken, EncryptedAccessToken = GetEncryptedAccessToken(accessToken), ExpireInSeconds = (int)_configuration.Expiration.TotalSeconds, UserId = loginResult.User.Id }; }