using Abp; using Abp.Dependency; using Abp.Domain.Repositories; using Abp.Domain.Uow; using Abp.Extensions; using Abp.Linq; using Castle.Core.Logging; using Microsoft.AspNetCore.Identity; using System.Globalization; using System.Security.Claims; using System.Transactions; using VberZero.BaseSystem.Organizations; using VberZero.BaseSystem.Roles; using VberZero.BaseSystem.Users; using VberZero.MultiTenancy; using VberZero.Session; using VberZero.Tools; using ILogger = Castle.Core.Logging.ILogger; namespace VberZero.Authorization.Users; /// /// 用户和角色类型的持久性存储的新实例 /// public class VzUserStore : IUserLoginStore, IUserRoleStore, IUserClaimStore, IUserPasswordStore, IUserSecurityStampStore, IUserEmailStore, IUserLockoutStore, IUserPhoneNumberStore, IUserTwoFactorStore, IUserAuthenticationTokenStore, IUserPermissionStore, IQueryableUserStore, IUserAuthenticatorKeyStore, ITransientDependency { public ILogger Logger { get; set; } /// /// 获取或设置当前操作发生的任何错误的 。 /// public IdentityErrorDescriber ErrorDescriber { get; set; } /// /// 调用 CreateAsync、UpdateAsync 和 DeleteAsync 后是否自动保存 /// /// /// 如果应自动保存,则为 true,否则为 false。 /// public bool AutoSaveChanges { get; set; } = true; public IVzSession AbpSession { get; set; } public IQueryable Users => UserRepository.GetAll(); public IRepository UserRepository { get; } public IAsyncQueryableExecuter AsyncQueryableExecuter { get; set; } private readonly IRepository _roleRepository; private readonly IRepository _userRoleRepository; private readonly IRepository _userLoginRepository; private readonly IRepository _userClaimRepository; private readonly IRepository _userPermissionSettingRepository; private readonly IRepository _userOrganizationUnitRepository; private readonly IRepository _organizationUniRoleRepository; private readonly IUnitOfWorkManager _unitOfWorkManager; private readonly TenantStore _tenantStore; public VzUserStore( IUnitOfWorkManager unitOfWorkManager, IRepository userRepository, IRepository roleRepository, IRepository userRoleRepository, IRepository userLoginRepository, IRepository userClaimRepository, IRepository userPermissionSettingRepository, IRepository userOrganizationUnitRepository, IRepository organizationUniRoleRepository, TenantStore tenantStore) { _unitOfWorkManager = unitOfWorkManager; UserRepository = userRepository; _roleRepository = roleRepository; _userRoleRepository = userRoleRepository; _userLoginRepository = userLoginRepository; _userClaimRepository = userClaimRepository; _userPermissionSettingRepository = userPermissionSettingRepository; _userOrganizationUnitRepository = userOrganizationUnitRepository; _organizationUniRoleRepository = organizationUniRoleRepository; _tenantStore = tenantStore; AbpSession = NullVzSession.Instance; ErrorDescriber = new IdentityErrorDescriber(); Logger = NullLogger.Instance; AsyncQueryableExecuter = NullAsyncQueryableExecuter.Instance; } /// /// 保存当前库 /// /// 取消操作的通知 protected Task SaveChangesAsync(CancellationToken cancellationToken) { if (!AutoSaveChanges || _unitOfWorkManager.Current == null) { return Task.CompletedTask; } return _unitOfWorkManager.Current.SaveChangesAsync(); } /// /// 保存当前库 /// /// 取消操作的通知 protected void SaveChanges(CancellationToken cancellationToken) { if (!AutoSaveChanges || _unitOfWorkManager.Current == null) { return; } _unitOfWorkManager.Current.SaveChanges(); } #region USER /// /// 获取指定 的用户 ID /// /// /// 取消操作的通知 public virtual Task GetUserIdAsync(User user, CancellationToken cancellationToken = default) { return Task.FromResult(GetUserId(user, cancellationToken)); } /// /// 获取指定 的用户 ID /// /// /// 取消操作的通知 public virtual string GetUserId(User user, CancellationToken cancellationToken = default) { cancellationToken.ThrowIfCancellationRequested(); Check.NotNull(user, nameof(user)); return user.Id.ToString(); } /// /// 获取指定 的用户名 /// /// /// 取消操作的通知 public virtual Task GetUserNameAsync(User user, CancellationToken cancellationToken = default) { return Task.FromResult(GetUserName(user, cancellationToken)); } /// /// 获取指定 的用户名 /// /// /// 取消操作的通知 public virtual string GetUserName(User user, CancellationToken cancellationToken = default) { cancellationToken.ThrowIfCancellationRequested(); Check.NotNull(user, nameof(user)); return user.UserName; } /// /// 为指定的 设置给定的 。 /// /// /// /// 取消操作的通知 public virtual Task SetUserNameAsync(User user, string userName, CancellationToken cancellationToken = default) { SetUserName(user, userName, cancellationToken); return Task.CompletedTask; } /// /// 为指定的 设置给定的 。 /// /// /// /// 取消操作的通知 public virtual void SetUserName(User user, string userName, CancellationToken cancellationToken = default) { cancellationToken.ThrowIfCancellationRequested(); Check.NotNull(user, nameof(user)); user.UserName = userName; } /// /// 获取指定 的规范化用户名。 /// /// /// 取消操作的通知 public virtual Task GetNormalizedUserNameAsync(User user, CancellationToken cancellationToken = default) { return Task.FromResult(GetNormalizedUserName(user, cancellationToken)); } /// /// 获取指定 的规范化用户名。 /// /// /// 取消操作的通知 public virtual string GetNormalizedUserName(User user, CancellationToken cancellationToken = default) { cancellationToken.ThrowIfCancellationRequested(); Check.NotNull(user, nameof(user)); return user.NormalizedUserName; } /// /// 设置规范化名称。 /// /// /// /// 取消操作的通知 public virtual Task SetNormalizedUserNameAsync(User user, string normalizedName, CancellationToken cancellationToken = default) { SetNormalizedUserName(user, normalizedName, cancellationToken); return Task.CompletedTask; } /// /// 设置规范化名称 /// /// /// /// 取消操作的通知 public virtual void SetNormalizedUserName(User user, string normalizedName, CancellationToken cancellationToken = default) { cancellationToken.ThrowIfCancellationRequested(); Check.NotNull(user, nameof(user)); user.NormalizedUserName = normalizedName; } /// /// 创建用户 /// /// The user to create. /// 取消操作的通知 public virtual async Task CreateAsync(User user, CancellationToken cancellationToken = default) { return await _unitOfWorkManager.WithUnitOfWorkAsync(async () => { cancellationToken.ThrowIfCancellationRequested(); Check.NotNull(user, nameof(user)); await UserRepository.InsertAsync(user); await SaveChangesAsync(cancellationToken); return IdentityResult.Success; }); } /// /// 创建用户 /// /// The user to create. /// 取消操作的通知 public virtual IdentityResult Create(User user, CancellationToken cancellationToken = default) { return _unitOfWorkManager.WithUnitOfWork(() => { cancellationToken.ThrowIfCancellationRequested(); Check.NotNull(user, nameof(user)); UserRepository.Insert(user); SaveChanges(cancellationToken); return IdentityResult.Success; }); } /// /// 修改用户 /// /// /// 取消操作的通知 public virtual async Task UpdateAsync(User user, CancellationToken cancellationToken = default) { return await _unitOfWorkManager.WithUnitOfWorkAsync(async () => { cancellationToken.ThrowIfCancellationRequested(); Check.NotNull(user, nameof(user)); user.ConcurrencyStamp = Guid.NewGuid().ToString(); await UserRepository.UpdateAsync(user); try { await SaveChangesAsync(cancellationToken); } catch (AbpDbConcurrencyException ex) { Logger.Warn(ex.ToString(), ex); return IdentityResult.Failed(ErrorDescriber.ConcurrencyFailure()); } await SaveChangesAsync(cancellationToken); return IdentityResult.Success; }); } /// /// 修改用户 /// /// /// 取消操作的通知 public virtual IdentityResult Update(User user, CancellationToken cancellationToken = default) { return _unitOfWorkManager.WithUnitOfWork(() => { cancellationToken.ThrowIfCancellationRequested(); Check.NotNull(user, nameof(user)); user.ConcurrencyStamp = Guid.NewGuid().ToString(); UserRepository.Update(user); try { SaveChanges(cancellationToken); } catch (AbpDbConcurrencyException ex) { Logger.Warn(ex.ToString(), ex); return IdentityResult.Failed(ErrorDescriber.ConcurrencyFailure()); } SaveChanges(cancellationToken); return IdentityResult.Success; }); } /// /// 删除用户 /// /// /// 取消操作的通知 public virtual async Task DeleteAsync(User user, CancellationToken cancellationToken = default) { return await _unitOfWorkManager.WithUnitOfWorkAsync(async () => { cancellationToken.ThrowIfCancellationRequested(); Check.NotNull(user, nameof(user)); await UserRepository.DeleteAsync(user); try { await SaveChangesAsync(cancellationToken); } catch (AbpDbConcurrencyException ex) { Logger.Warn(ex.ToString(), ex); return IdentityResult.Failed(ErrorDescriber.ConcurrencyFailure()); } await SaveChangesAsync(cancellationToken); return IdentityResult.Success; }); } /// /// 删除用户 /// /// /// 取消操作的通知 public virtual IdentityResult Delete(User user, CancellationToken cancellationToken = default) { return _unitOfWorkManager.WithUnitOfWork(() => { cancellationToken.ThrowIfCancellationRequested(); Check.NotNull(user, nameof(user)); UserRepository.Delete(user); try { SaveChanges(cancellationToken); } catch (AbpDbConcurrencyException ex) { Logger.Warn(ex.ToString(), ex); return IdentityResult.Failed(ErrorDescriber.ConcurrencyFailure()); } SaveChanges(cancellationToken); return IdentityResult.Success; }); } /// /// 查询用户根据 /// /// /// 取消操作的通知 public virtual async Task FindByIdAsync(string userId, CancellationToken cancellationToken = default) { return await _unitOfWorkManager.WithUnitOfWorkAsync(async () => { cancellationToken.ThrowIfCancellationRequested(); return await UserRepository.FirstOrDefaultAsync(userId.To()); }); } /// /// 查询用户根据 /// /// /// 取消操作的通知 public virtual User FindById(string userId, CancellationToken cancellationToken = default) { return _unitOfWorkManager.WithUnitOfWork(() => { cancellationToken.ThrowIfCancellationRequested(); return UserRepository.FirstOrDefault(userId.To()); }); } /// /// 查询指定规范化用户名的用户 /// /// /// 取消操作的通知 public virtual async Task FindByNameAsync(string normalizedUserName, CancellationToken cancellationToken = default) { return await _unitOfWorkManager.WithUnitOfWorkAsync(async () => { cancellationToken.ThrowIfCancellationRequested(); Check.NotNull(normalizedUserName, nameof(normalizedUserName)); return await UserRepository.FirstOrDefaultAsync(u => u.NormalizedUserName == normalizedUserName); }); } /// /// 查询指定规范化用户名的用户 /// /// /// 取消操作的通知 public virtual User FindByName(string normalizedUserName, CancellationToken cancellationToken = default) { return _unitOfWorkManager.WithUnitOfWork(() => { cancellationToken.ThrowIfCancellationRequested(); Check.NotNull(normalizedUserName, nameof(normalizedUserName)); return UserRepository.FirstOrDefault(u => u.NormalizedUserName == normalizedUserName); }); } /// /// 设置用户密码哈希 /// /// /// /// 取消操作的通知 public virtual Task SetPasswordHashAsync(User user, string passwordHash, CancellationToken cancellationToken = default) { SetPasswordHash(user, passwordHash, cancellationToken); return Task.CompletedTask; } /// /// 设置用户密码哈希 /// /// /// /// 取消操作的通知 public virtual void SetPasswordHash(User user, string passwordHash, CancellationToken cancellationToken = default) { cancellationToken.ThrowIfCancellationRequested(); Check.NotNull(user, nameof(user)); user.Password = passwordHash; } /// /// 获取用户的密码哈希 /// /// /// 取消操作的通知 public virtual Task GetPasswordHashAsync(User user, CancellationToken cancellationToken = default) { cancellationToken.ThrowIfCancellationRequested(); Check.NotNull(user, nameof(user)); return Task.FromResult(user.Password); } /// /// 获取用户的密码哈希 /// /// /// 取消操作的通知 public virtual string GetPasswordHash(User user, CancellationToken cancellationToken = default) { cancellationToken.ThrowIfCancellationRequested(); Check.NotNull(user, nameof(user)); return user.Password; } /// /// 返回一个标志,指示指定的用户是否有密码 /// /// /// 取消操作的通知 public virtual Task HasPasswordAsync(User user, CancellationToken cancellationToken = default) { cancellationToken.ThrowIfCancellationRequested(); Check.NotNull(user, nameof(user)); return Task.FromResult(user.Password != null); } /// /// 返回一个标志,指示指定的用户是否有密码 /// /// /// 取消操作的通知 public virtual bool HasPassword(User user, CancellationToken cancellationToken = default) { cancellationToken.ThrowIfCancellationRequested(); Check.NotNull(user, nameof(user)); return user.Password != null; } public async Task GetTenancyNameAsync(string userNameOrEmailOrPhone) { using (_unitOfWorkManager.Current.DisableFilter(AbpDataFilters.MayHaveTenant)) { var user = await FindByNameOrEmailOrPhoneAsync(userNameOrEmailOrPhone); if (user == null || user.TenantId == null) { return null; } var tenant = _tenantStore.FindTenantCache(user.TenantId.Value); if (tenant == null || !tenant.IsActive) { return null; } return tenant.TenancyName; } } public string GetTenancyName(string userNameOrEmailOrPhone) { using (_unitOfWorkManager.Current.DisableFilter(AbpDataFilters.MayHaveTenant)) { var user = FindByNameOrEmailOrPhone(userNameOrEmailOrPhone); if (user.TenantId == null) { return null; } var tenant = _tenantStore.FindTenantCache(user.TenantId.Value); if (tenant == null || !tenant.IsActive) { return null; } return tenant.TenancyName; } } #endregion USER #region ROLE /// /// 将给定的 添加到指定的 。 /// /// /// /// 取消操作的通知 public virtual async Task AddToRoleAsync(User user, string normalizedRoleName, CancellationToken cancellationToken = default) { await _unitOfWorkManager.WithUnitOfWorkAsync(async () => { cancellationToken.ThrowIfCancellationRequested(); Check.NotNull(user, nameof(user)); Check.NotNull(normalizedRoleName, nameof(normalizedRoleName)); if (await IsInRoleAsync(user, normalizedRoleName, cancellationToken)) { return; } var role = await _roleRepository.FirstOrDefaultAsync(r => r.NormalizedName == normalizedRoleName); if (role == null) { throw new InvalidOperationException(string.Format(CultureInfo.CurrentCulture, "Role {0} does not exist!", normalizedRoleName)); } await UserRepository.EnsureCollectionLoadedAsync(user, u => u.Roles, cancellationToken); user.Roles.Add(new UserRole(user.TenantId, user.Id, role.Id)); }); } /// /// 将给定的 添加到指定的 。 /// /// The user to add the role to. /// The role to add. /// 取消操作的通知 public virtual void AddToRole(User user, string normalizedRoleName, CancellationToken cancellationToken = default) { _unitOfWorkManager.WithUnitOfWork(() => { cancellationToken.ThrowIfCancellationRequested(); Check.NotNull(user, nameof(user)); Check.NotNull(normalizedRoleName, nameof(normalizedRoleName)); if (IsInRole(user, normalizedRoleName, cancellationToken)) { return; } var role = _roleRepository.FirstOrDefault(r => r.NormalizedName == normalizedRoleName); if (role == null) { throw new InvalidOperationException(string.Format(CultureInfo.CurrentCulture, "Role {0} does not exist!", normalizedRoleName)); } UserRepository.EnsureCollectionLoaded(user, u => u.Roles, cancellationToken); user.Roles.Add(new UserRole(user.TenantId, user.Id, role.Id)); }); } /// /// 从指定的 中删除给定的 。 /// /// /// /// 取消操作的通知 public virtual async Task RemoveFromRoleAsync(User user, string normalizedRoleName, CancellationToken cancellationToken = default) { await _unitOfWorkManager.WithUnitOfWorkAsync(async () => { cancellationToken.ThrowIfCancellationRequested(); Check.NotNull(user, nameof(user)); if (string.IsNullOrWhiteSpace(normalizedRoleName)) { throw new ArgumentException(nameof(normalizedRoleName) + " can not be null or whitespace"); } if (!await IsInRoleAsync(user, normalizedRoleName, cancellationToken)) { return; } var role = await _roleRepository.FirstOrDefaultAsync(r => r.NormalizedName == normalizedRoleName); if (role == null) { return; } await UserRepository.EnsureCollectionLoadedAsync(user, u => u.Roles, cancellationToken); user.Roles.RemoveAll(r => r.RoleId == role.Id); }); } /// /// 从指定的 中删除给定的 。 /// /// /// /// 取消操作的通知 public virtual void RemoveFromRole(User user, string normalizedRoleName, CancellationToken cancellationToken = default) { _unitOfWorkManager.WithUnitOfWork(() => { cancellationToken.ThrowIfCancellationRequested(); Check.NotNull(user, nameof(user)); if (string.IsNullOrWhiteSpace(normalizedRoleName)) { throw new ArgumentException(nameof(normalizedRoleName) + " can not be null or whitespace"); } if (!IsInRole(user, normalizedRoleName, cancellationToken)) { return; } var role = _roleRepository.FirstOrDefault(r => r.NormalizedName == normalizedRoleName); if (role == null) { return; } user.Roles.RemoveAll(r => r.RoleId == role.Id); }); } /// /// 检索指定 所属的角色。 /// /// /// 取消操作的通知 public virtual async Task> GetRolesAsync(User user, CancellationToken cancellationToken = default) { return await _unitOfWorkManager.WithUnitOfWorkAsync(async () => { cancellationToken.ThrowIfCancellationRequested(); Check.NotNull(user, nameof(user)); var userRoles = await AsyncQueryableExecuter.ToListAsync(from userRole in _userRoleRepository.GetAll() join role in _roleRepository.GetAll() on userRole.RoleId equals role.Id where userRole.UserId == user.Id select role.Name); var userOrganizationUnitRoles = await AsyncQueryableExecuter.ToListAsync( from userOu in _userOrganizationUnitRepository.GetAll() join roleOu in _organizationUniRoleRepository.GetAll() on userOu.OrganizationUnitId equals roleOu .OrganizationUnitId join userOuRoles in _roleRepository.GetAll() on roleOu.RoleId equals userOuRoles.Id where userOu.UserId == user.Id select userOuRoles.Name); return userRoles.Union(userOrganizationUnitRoles).ToList(); }); } /// /// 检索指定 所属的角色。 /// /// /// 取消操作的通知 public virtual IList GetRoles(User user, CancellationToken cancellationToken = default) { return _unitOfWorkManager.WithUnitOfWork(() => { cancellationToken.ThrowIfCancellationRequested(); Check.NotNull(user, nameof(user)); var userRoles = ( from userRole in _userRoleRepository.GetAll() join role in _roleRepository.GetAll() on userRole.RoleId equals role.Id where userRole.UserId == user.Id select role.Name ).ToList(); var userOrganizationUnitRoles = ( from userOu in _userOrganizationUnitRepository.GetAll() join roleOu in _organizationUniRoleRepository.GetAll() on userOu.OrganizationUnitId equals roleOu .OrganizationUnitId join userOuRoles in _roleRepository.GetAll() on roleOu.RoleId equals userOuRoles.Id where userOu.UserId == user.Id select userOuRoles.Name ).ToList(); return userRoles.Union(userOrganizationUnitRoles).ToList(); }); } /// /// 返回一个标志,指示指定的用户是否是给定 的成员。 /// /// /// /// 取消操作的通知 public virtual async Task IsInRoleAsync(User user, string normalizedRoleName, CancellationToken cancellationToken = default) { cancellationToken.ThrowIfCancellationRequested(); Check.NotNull(user, nameof(user)); if (string.IsNullOrWhiteSpace(normalizedRoleName)) { throw new ArgumentException(nameof(normalizedRoleName) + " can not be null or whitespace"); } return (await GetRolesAsync(user, cancellationToken)).Any(r => r.ToUpperInvariant() == normalizedRoleName); } /// /// 返回一个标志,指示指定的用户是否是给定 的成员。 /// /// /// /// 取消操作的通知 public virtual bool IsInRole(User user, string normalizedRoleName, CancellationToken cancellationToken = default) { cancellationToken.ThrowIfCancellationRequested(); Check.NotNull(user, nameof(user)); if (string.IsNullOrWhiteSpace(normalizedRoleName)) { throw new ArgumentException(nameof(normalizedRoleName) + " can not be null or whitespace"); } return (GetRoles(user, cancellationToken)).Any(r => r.ToUpperInvariant() == normalizedRoleName); } /// /// 检索指定角色中的所有用户。 /// /// The role whose users should be retrieved. /// 取消操作的通知 /// /// The contains a list of users, if any, that are in the specified role. /// public virtual async Task> GetUsersInRoleAsync(string normalizedRoleName, CancellationToken cancellationToken = default) { return await _unitOfWorkManager.WithUnitOfWorkAsync(async () => { cancellationToken.ThrowIfCancellationRequested(); if (string.IsNullOrEmpty(normalizedRoleName)) { throw new ArgumentNullException(nameof(normalizedRoleName)); } var role = await _roleRepository.FirstOrDefaultAsync(r => r.NormalizedName == normalizedRoleName); if (role == null) { return new List(); } var query = from userRole in _userRoleRepository.GetAll() join user in UserRepository.GetAll() on userRole.UserId equals user.Id where userRole.RoleId.Equals(role.Id) select user; return await AsyncQueryableExecuter.ToListAsync(query); }); } /// /// 检索指定角色中的所有用户。 /// /// The role whose users should be retrieved. /// 取消操作的通知 /// /// The contains a list of users, if any, that are in the specified role. /// public virtual IList GetUsersInRole(string normalizedRoleName, CancellationToken cancellationToken = default) { return _unitOfWorkManager.WithUnitOfWork(() => { cancellationToken.ThrowIfCancellationRequested(); if (string.IsNullOrEmpty(normalizedRoleName)) { throw new ArgumentNullException(nameof(normalizedRoleName)); } var role = _roleRepository.FirstOrDefault(r => r.NormalizedName == normalizedRoleName); if (role == null) { return new List(); } var query = from userRole in _userRoleRepository.GetAll() join user in UserRepository.GetAll() on userRole.UserId equals user.Id where userRole.RoleId.Equals(role.Id) select user; return query.ToList(); }); } #endregion ROLE /// /// Dispose /// public void Dispose() { } #region Claim /// /// 获取与指定 关联的声明 /// /// /// 取消操作的通知 public virtual async Task> GetClaimsAsync(User user, CancellationToken cancellationToken = default) { return await _unitOfWorkManager.WithUnitOfWorkAsync(async () => { cancellationToken.ThrowIfCancellationRequested(); Check.NotNull(user, nameof(user)); await UserRepository.EnsureCollectionLoadedAsync(user, u => u.Claims, cancellationToken); return user.Claims.Select(c => new Claim(c.ClaimType, c.ClaimValue)).ToList(); }); } /// /// 获取与指定 关联的声明 /// /// /// 取消操作的通知 public virtual IList GetClaims(User user, CancellationToken cancellationToken = default) { return _unitOfWorkManager.WithUnitOfWork(() => { cancellationToken.ThrowIfCancellationRequested(); Check.NotNull(user, nameof(user)); UserRepository.EnsureCollectionLoaded(user, u => u.Claims, cancellationToken); return user.Claims.Select(c => new Claim(c.ClaimType, c.ClaimValue)).ToList(); }); } /// /// 将给定的 添加到指定的 。 /// /// /// /// 取消操作的通知 public virtual async Task AddClaimsAsync(User user, IEnumerable claims, CancellationToken cancellationToken = default) { await _unitOfWorkManager.WithUnitOfWorkAsync(async () => { cancellationToken.ThrowIfCancellationRequested(); Check.NotNull(user, nameof(user)); var list = claims.ToList(); Check.NotNull(list, nameof(claims)); await UserRepository.EnsureCollectionLoadedAsync(user, u => u.Claims, cancellationToken); foreach (var claim in list) { user.Claims.Add(new UserClaim(user, claim)); } }); } /// /// 将给定的 添加到指定的 。 /// /// /// /// 取消操作的通知 public virtual void AddClaims(User user, IEnumerable claims, CancellationToken cancellationToken = default) { _unitOfWorkManager.WithUnitOfWork(() => { cancellationToken.ThrowIfCancellationRequested(); Check.NotNull(user, nameof(user)); var list = claims.ToList(); Check.NotNull(list, nameof(claims)); UserRepository.EnsureCollectionLoaded(user, u => u.Claims, cancellationToken); foreach (var claim in list) { user.Claims.Add(new UserClaim(user, claim)); } }); } /// /// 将指定的 上的 替换为 。 /// /// /// /// /// 取消操作的通知 public virtual async Task ReplaceClaimAsync(User user, Claim claim, Claim newClaim, CancellationToken cancellationToken = default) { await _unitOfWorkManager.WithUnitOfWorkAsync(async () => { cancellationToken.ThrowIfCancellationRequested(); Check.NotNull(user, nameof(user)); Check.NotNull(claim, nameof(claim)); Check.NotNull(newClaim, nameof(newClaim)); await UserRepository.EnsureCollectionLoadedAsync(user, u => u.Claims, cancellationToken); var userClaims = user.Claims.Where(uc => uc.ClaimValue == claim.Value && uc.ClaimType == claim.Type); foreach (var userClaim in userClaims) { userClaim.ClaimType = newClaim.Type; userClaim.ClaimValue = newClaim.Value; } }); } /// /// 将指定的 上的 替换为 。 /// /// /// /// /// 取消操作的通知 public virtual void ReplaceClaim(User user, Claim claim, Claim newClaim, CancellationToken cancellationToken = default) { _unitOfWorkManager.WithUnitOfWork(() => { cancellationToken.ThrowIfCancellationRequested(); Check.NotNull(user, nameof(user)); Check.NotNull(claim, nameof(claim)); Check.NotNull(newClaim, nameof(newClaim)); UserRepository.EnsureCollectionLoaded(user, u => u.Claims, cancellationToken); var userClaims = user.Claims.Where(uc => uc.ClaimValue == claim.Value && uc.ClaimType == claim.Type); foreach (var userClaim in userClaims) { userClaim.ClaimType = claim.Type; userClaim.ClaimValue = claim.Value; } }); } /// /// 从指定的 中删除给定的 。 /// /// /// /// 取消操作的通知 public virtual async Task RemoveClaimsAsync(User user, IEnumerable claims, CancellationToken cancellationToken = default) { await _unitOfWorkManager.WithUnitOfWorkAsync(async () => { cancellationToken.ThrowIfCancellationRequested(); Check.NotNull(user, nameof(user)); var list = claims.ToList(); Check.NotNull(list, nameof(claims)); await UserRepository.EnsureCollectionLoadedAsync(user, u => u.Claims, cancellationToken); foreach (var claim in list) { user.Claims.RemoveAll(c => c.ClaimValue == claim.Value && c.ClaimType == claim.Type); } }); } /// /// 从指定的 中删除给定的 。 /// /// /// /// 取消操作的通知 public virtual void RemoveClaims(User user, IEnumerable claims, CancellationToken cancellationToken = default) { _unitOfWorkManager.WithUnitOfWork(() => { cancellationToken.ThrowIfCancellationRequested(); Check.NotNull(user, nameof(user)); var list = claims.ToList(); Check.NotNull(list, nameof(claims)); UserRepository.EnsureCollectionLoaded(user, u => u.Claims, cancellationToken); foreach (var claim in list) { user.Claims.RemoveAll(c => c.ClaimValue == claim.Value && c.ClaimType == claim.Type); } }); } /// /// 检索具有指定声明的所有用户。 /// /// /// 取消操作的通知 /// /// The contains a list of users, if any, that contain the specified claim. /// public virtual async Task> GetUsersForClaimAsync(Claim claim, CancellationToken cancellationToken = default) { return await _unitOfWorkManager.WithUnitOfWorkAsync(async () => { cancellationToken.ThrowIfCancellationRequested(); Check.NotNull(claim, nameof(claim)); var query = from userClaims in _userClaimRepository.GetAll() join user in UserRepository.GetAll() on userClaims.UserId equals user.Id where userClaims.ClaimValue == claim.Value && userClaims.ClaimType == claim.Type && userClaims.TenantId == AbpSession.TenantId select user; return await AsyncQueryableExecuter.ToListAsync(query); }); } /// /// 检索具有指定声明的所有用户。 /// /// /// 取消操作的通知 /// /// The contains a list of users, if any, that contain the specified claim. /// public virtual IList GetUsersForClaim(Claim claim, CancellationToken cancellationToken = default) { return _unitOfWorkManager.WithUnitOfWork(() => { cancellationToken.ThrowIfCancellationRequested(); Check.NotNull(claim, nameof(claim)); var query = from userClaims in _userClaimRepository.GetAll() join user in UserRepository.GetAll() on userClaims.UserId equals user.Id where userClaims.ClaimValue == claim.Value && userClaims.ClaimType == claim.Type && userClaims.TenantId == AbpSession.TenantId select user; return query.ToList(); }); } #endregion Claim #region Login /// /// 将给定的 添加到指定的 /// /// /// /// 取消操作的通知 public virtual async Task AddLoginAsync(User user, UserLoginInfo login, CancellationToken cancellationToken = default) { await _unitOfWorkManager.WithUnitOfWorkAsync(async () => { cancellationToken.ThrowIfCancellationRequested(); Check.NotNull(user, nameof(user)); Check.NotNull(login, nameof(login)); await UserRepository.EnsureCollectionLoadedAsync(user, u => u.Logins, cancellationToken); user.Logins.Add(new UserLogin(user.TenantId, user.Id, login.LoginProvider, login.ProviderKey)); }); } /// /// 将给定的 添加到指定的 /// /// /// /// 取消操作的通知 public virtual void AddLogin(User user, UserLoginInfo login, CancellationToken cancellationToken = default) { _unitOfWorkManager.WithUnitOfWork(() => { cancellationToken.ThrowIfCancellationRequested(); Check.NotNull(user, nameof(user)); Check.NotNull(login, nameof(login)); UserRepository.EnsureCollectionLoaded(user, u => u.Logins, cancellationToken); user.Logins.Add(new UserLogin(user.TenantId, user.Id, login.LoginProvider, login.ProviderKey)); }); } /// /// 从指定的 中删除给定的 /// /// /// /// /// 取消操作的通知 public virtual async Task RemoveLoginAsync(User user, string loginProvider, string providerKey, CancellationToken cancellationToken = default) { await _unitOfWorkManager.WithUnitOfWorkAsync(async () => { cancellationToken.ThrowIfCancellationRequested(); Check.NotNull(user, nameof(user)); Check.NotNull(loginProvider, nameof(loginProvider)); Check.NotNull(providerKey, nameof(providerKey)); await UserRepository.EnsureCollectionLoadedAsync(user, u => u.Logins, cancellationToken); user.Logins.RemoveAll(userLogin => userLogin.LoginProvider == loginProvider && userLogin.ProviderKey == providerKey ); }); } /// /// 从指定的 中删除给定的 /// /// /// /// /// 取消操作的通知 public virtual void RemoveLogin(User user, string loginProvider, string providerKey, CancellationToken cancellationToken = default) { _unitOfWorkManager.WithUnitOfWork(() => { cancellationToken.ThrowIfCancellationRequested(); Check.NotNull(user, nameof(user)); Check.NotNull(loginProvider, nameof(loginProvider)); Check.NotNull(providerKey, nameof(providerKey)); UserRepository.EnsureCollectionLoaded(user, u => u.Logins, cancellationToken); user.Logins.RemoveAll(userLogin => userLogin.LoginProvider == loginProvider && userLogin.ProviderKey == providerKey ); }); } /// /// 检索指定 的关联登录。 /// /// /// 取消操作的通知 public virtual async Task> GetLoginsAsync(User user, CancellationToken cancellationToken = default) { return await _unitOfWorkManager.WithUnitOfWorkAsync(async () => { cancellationToken.ThrowIfCancellationRequested(); Check.NotNull(user, nameof(user)); await UserRepository.EnsureCollectionLoadedAsync(user, u => u.Logins, cancellationToken); return user.Logins.Select(l => new UserLoginInfo(l.LoginProvider, l.ProviderKey, l.LoginProvider)) .ToList(); }); } /// /// 检索指定 的关联登录。 /// /// /// 取消操作的通知 public virtual IList GetLogins(User user, CancellationToken cancellationToken = default) { return _unitOfWorkManager.WithUnitOfWork(() => { cancellationToken.ThrowIfCancellationRequested(); Check.NotNull(user, nameof(user)); UserRepository.EnsureCollectionLoaded(user, u => u.Logins, cancellationToken); return user.Logins .Select(l => new UserLoginInfo(l.LoginProvider, l.ProviderKey, l.LoginProvider)) .ToList(); }); } /// /// 检索与指定登录提供程序和登录提供程序密钥关联的用户 /// /// /// /// 取消操作的通知 public virtual async Task FindByLoginAsync(string loginProvider, string providerKey, CancellationToken cancellationToken = default) { return await _unitOfWorkManager.WithUnitOfWorkAsync(async () => { cancellationToken.ThrowIfCancellationRequested(); Check.NotNull(loginProvider, nameof(loginProvider)); Check.NotNull(providerKey, nameof(providerKey)); var query = from userLogin in _userLoginRepository.GetAll() join user in UserRepository.GetAll() on userLogin.UserId equals user.Id where userLogin.LoginProvider == loginProvider && userLogin.ProviderKey == providerKey && userLogin.TenantId == AbpSession.TenantId select user; return await AsyncQueryableExecuter.FirstOrDefaultAsync(query); }); } /// /// 检索与指定登录提供程序和登录提供程序密钥关联的用户 /// /// /// /// 取消操作的通知 public virtual User FindByLogin(string loginProvider, string providerKey, CancellationToken cancellationToken = default) { return _unitOfWorkManager.WithUnitOfWork(() => { cancellationToken.ThrowIfCancellationRequested(); Check.NotNull(loginProvider, nameof(loginProvider)); Check.NotNull(providerKey, nameof(providerKey)); var query = from userLogin in _userLoginRepository.GetAll() join user in UserRepository.GetAll() on userLogin.UserId equals user.Id where userLogin.LoginProvider == loginProvider && userLogin.ProviderKey == providerKey && userLogin.TenantId == AbpSession.TenantId select user; return query.FirstOrDefault(); }); } #endregion Login #region Email /// /// 获取一个标志,指示指定的 的电子邮件地址是否已被验证 /// /// /// 取消操作的通知 public virtual Task GetEmailConfirmedAsync(User user, CancellationToken cancellationToken = default) { cancellationToken.ThrowIfCancellationRequested(); Check.NotNull(user, nameof(user)); return Task.FromResult(user.IsEmailConfirmed); } /// /// 获取一个标志,指示指定的 的电子邮件地址是否已被验证 /// /// The user whose email confirmation status should be returned. /// 取消操作的通知 public virtual bool GetEmailConfirmed(User user, CancellationToken cancellationToken = default) { cancellationToken.ThrowIfCancellationRequested(); Check.NotNull(user, nameof(user)); return user.IsEmailConfirmed; } /// /// 设置指示指定的 的电子邮件地址是否已被确认的标志 /// /// /// /// 取消操作的通知 public virtual Task SetEmailConfirmedAsync(User user, bool confirmed, CancellationToken cancellationToken = default) { cancellationToken.ThrowIfCancellationRequested(); Check.NotNull(user, nameof(user)); user.IsEmailConfirmed = confirmed; return Task.CompletedTask; } /// /// 设置指示指定的 的电子邮件地址是否已被确认的标志 /// /// /// /// 取消操作的通知 public virtual void SetEmailConfirmed(User user, bool confirmed, CancellationToken cancellationToken = default) { cancellationToken.ThrowIfCancellationRequested(); Check.NotNull(user, nameof(user)); user.IsEmailConfirmed = confirmed; } /// /// 为 设置 地址 /// /// /// /// 取消操作的通知 public virtual Task SetEmailAsync(User user, string email, CancellationToken cancellationToken = default) { cancellationToken.ThrowIfCancellationRequested(); Check.NotNull(user, nameof(user)); user.EmailAddress = email; return Task.CompletedTask; } /// /// 为 设置 地址 /// /// /// /// 取消操作的通知 public virtual void SetEmail(User user, string email, CancellationToken cancellationToken = default) { cancellationToken.ThrowIfCancellationRequested(); Check.NotNull(user, nameof(user)); user.EmailAddress = email; } /// /// 获取指定 的电子邮件地址 /// /// /// 取消操作的通知 public virtual Task GetEmailAsync(User user, CancellationToken cancellationToken = default) { cancellationToken.ThrowIfCancellationRequested(); Check.NotNull(user, nameof(user)); return Task.FromResult(user.EmailAddress); } /// /// 获取指定 的电子邮件地址 /// /// /// 取消操作的通知 public virtual string GetEmail(User user, CancellationToken cancellationToken = default) { cancellationToken.ThrowIfCancellationRequested(); Check.NotNull(user, nameof(user)); return user.EmailAddress; } /// /// 返回指定 的规范化电子邮件。 /// /// /// 取消操作的通知 public virtual Task GetNormalizedEmailAsync(User user, CancellationToken cancellationToken = default) { cancellationToken.ThrowIfCancellationRequested(); Check.NotNull(user, nameof(user)); return Task.FromResult(user.NormalizedEmailAddress); } /// /// 返回指定 的规范化电子邮件。 /// /// /// 取消操作的通知 public virtual string GetNormalizedEmail(User user, CancellationToken cancellationToken = default) { cancellationToken.ThrowIfCancellationRequested(); Check.NotNull(user, nameof(user)); return user.NormalizedEmailAddress; } /// /// 为指定的 设置规范化的电子邮件 /// /// /// /// 取消操作的通知 public virtual Task SetNormalizedEmailAsync(User user, string normalizedEmail, CancellationToken cancellationToken = default) { cancellationToken.ThrowIfCancellationRequested(); Check.NotNull(user, nameof(user)); user.NormalizedEmailAddress = normalizedEmail; return Task.CompletedTask; } /// /// 为指定的 设置规范化的电子邮件 /// /// /// /// 取消操作的通知 public virtual void SetNormalizedEmail(User user, string normalizedEmail, CancellationToken cancellationToken = default) { cancellationToken.ThrowIfCancellationRequested(); Check.NotNull(user, nameof(user)); user.NormalizedEmailAddress = normalizedEmail; } /// /// 获取与指定的规范化电子邮件地址关联的用户(如果有) /// /// /// 取消操作的通知 public virtual async Task FindByEmailAsync(string normalizedEmail, CancellationToken cancellationToken = default) { return await _unitOfWorkManager.WithUnitOfWorkAsync(async () => { cancellationToken.ThrowIfCancellationRequested(); return await UserRepository.FirstOrDefaultAsync(u => u.NormalizedEmailAddress == normalizedEmail); }); } /// /// 获取与指定的规范化电子邮件地址关联的用户(如果有) /// /// /// 取消操作的通知 public virtual User FindByEmail(string normalizedEmail, CancellationToken cancellationToken = default) { return _unitOfWorkManager.WithUnitOfWork(() => { cancellationToken.ThrowIfCancellationRequested(); return UserRepository.FirstOrDefault(u => u.NormalizedEmailAddress == normalizedEmail); }); } #endregion Email #region Lockout /// /// 获取最后一个 用户的最后一次锁定过期(如果有)。 /// 过去的任何时间都应该表示用户没有被锁定。 /// /// /// 取消操作的通知 public virtual Task GetLockoutEndDateAsync(User user, CancellationToken cancellationToken = default) { cancellationToken.ThrowIfCancellationRequested(); Check.NotNull(user, nameof(user)); if (!user.LockoutEndDateUtc.HasValue) { return Task.FromResult(null); } var lockoutEndDate = DateTime.SpecifyKind(user.LockoutEndDateUtc.Value, DateTimeKind.Utc); return Task.FromResult(new DateTimeOffset(lockoutEndDate)); } /// /// 获取最后一个 用户的最后一次锁定过期(如果有)。 /// 过去的任何时间都应该表示用户没有被锁定。 /// /// /// 取消操作的通知 public virtual DateTimeOffset? GetLockoutEndDate(User user, CancellationToken cancellationToken = default) { cancellationToken.ThrowIfCancellationRequested(); Check.NotNull(user, nameof(user)); if (!user.LockoutEndDateUtc.HasValue) { return null; } var lockoutEndDate = DateTime.SpecifyKind(user.LockoutEndDateUtc.Value, DateTimeKind.Utc); return new DateTimeOffset(lockoutEndDate); } /// /// 在指定的结束日期过去之前锁定用户。 设置过去的结束日期会立即解锁用户。 /// /// /// /// 取消操作的通知 public virtual Task SetLockoutEndDateAsync(User user, DateTimeOffset? lockoutEnd, CancellationToken cancellationToken = default) { cancellationToken.ThrowIfCancellationRequested(); Check.NotNull(user, nameof(user)); user.LockoutEndDateUtc = lockoutEnd?.UtcDateTime; return Task.CompletedTask; } /// /// 在指定的结束日期过去之前锁定用户。 设置过去的结束日期会立即解锁用户。 /// /// /// /// 取消操作的通知 public virtual void SetLockoutEndDate(User user, DateTimeOffset? lockoutEnd, CancellationToken cancellationToken = default) { cancellationToken.ThrowIfCancellationRequested(); Check.NotNull(user, nameof(user)); user.LockoutEndDateUtc = lockoutEnd?.UtcDateTime; } /// /// 记录发生访问失败,增加失败访问计数。 /// /// /// 取消操作的通知 public virtual Task IncrementAccessFailedCountAsync(User user, CancellationToken cancellationToken = default) { cancellationToken.ThrowIfCancellationRequested(); Check.NotNull(user, nameof(user)); user.AccessFailedCount++; return Task.FromResult(user.AccessFailedCount); } /// /// 记录发生访问失败,增加失败访问计数。 /// /// /// 取消操作的通知 public virtual int IncrementAccessFailedCount(User user, CancellationToken cancellationToken = default) { cancellationToken.ThrowIfCancellationRequested(); Check.NotNull(user, nameof(user)); user.AccessFailedCount++; return user.AccessFailedCount; } /// /// 重置用户的失败访问计数。 /// /// /// 取消操作的通知 /// 这通常在成功访问帐户后调用。 public virtual Task ResetAccessFailedCountAsync(User user, CancellationToken cancellationToken = default) { cancellationToken.ThrowIfCancellationRequested(); Check.NotNull(user, nameof(user)); user.AccessFailedCount = 0; return Task.CompletedTask; } /// /// 重置用户的失败访问计数。 /// /// /// 取消操作的通知 /// 这通常在成功访问帐户后调用。 public virtual void ResetAccessFailedCount( User user, CancellationToken cancellationToken = default) { cancellationToken.ThrowIfCancellationRequested(); Check.NotNull(user, nameof(user)); user.AccessFailedCount = 0; } /// /// 检索指定 的当前失败访问计数 /// /// /// 取消操作的通知 public virtual Task GetAccessFailedCountAsync(User user, CancellationToken cancellationToken = default) { cancellationToken.ThrowIfCancellationRequested(); Check.NotNull(user, nameof(user)); return Task.FromResult(user.AccessFailedCount); } /// /// 检索指定 的当前失败访问计数 /// /// /// 取消操作的通知 public virtual int GetAccessFailedCount(User user, CancellationToken cancellationToken = default) { cancellationToken.ThrowIfCancellationRequested(); Check.NotNull(user, nameof(user)); return user.AccessFailedCount; } /// /// 检索指示是否可以为指定用户启用用户锁定的标志。 /// /// /// 取消操作的通知 public virtual Task GetLockoutEnabledAsync(User user, CancellationToken cancellationToken = default) { cancellationToken.ThrowIfCancellationRequested(); Check.NotNull(user, nameof(user)); return Task.FromResult(user.IsLockoutEnabled); } /// /// 检索指示是否可以为指定用户启用用户锁定的标志。 /// /// /// 取消操作的通知 public virtual bool GetLockoutEnabled(User user, CancellationToken cancellationToken = default) { cancellationToken.ThrowIfCancellationRequested(); Check.NotNull(user, nameof(user)); return user.IsLockoutEnabled; } /// /// 设置指示是否可以锁定指定的 的标志.. /// /// /// /// 取消操作的通知 public virtual Task SetLockoutEnabledAsync(User user, bool enabled, CancellationToken cancellationToken = default) { cancellationToken.ThrowIfCancellationRequested(); Check.NotNull(user, nameof(user)); user.IsLockoutEnabled = enabled; return Task.CompletedTask; } /// /// 设置指示是否可以锁定指定的 的标志.. /// /// /// /// 取消操作的通知 public virtual void SetLockoutEnabled(User user, bool enabled, CancellationToken cancellationToken = default) { cancellationToken.ThrowIfCancellationRequested(); Check.NotNull(user, nameof(user)); user.IsLockoutEnabled = enabled; } #endregion Lockout #region PhoneNumber /// /// 为指定的 设置电话号码。 /// /// /// /// 取消操作的通知 public virtual Task SetPhoneNumberAsync(User user, string phoneNumber, CancellationToken cancellationToken = default) { cancellationToken.ThrowIfCancellationRequested(); Check.NotNull(user, nameof(user)); user.PhoneNumber = phoneNumber; return Task.CompletedTask; } /// /// 为指定的 设置电话号码。 /// /// /// /// 取消操作的通知 public virtual void SetPhoneNumber(User user, string phoneNumber, CancellationToken cancellationToken = default) { cancellationToken.ThrowIfCancellationRequested(); Check.NotNull(user, nameof(user)); user.PhoneNumber = phoneNumber; } /// /// 获取指定 的电话号码(如果有)。 /// /// /// 取消操作的通知 public virtual Task GetPhoneNumberAsync(User user, CancellationToken cancellationToken = default) { cancellationToken.ThrowIfCancellationRequested(); Check.NotNull(user, nameof(user)); return Task.FromResult(user.PhoneNumber); } /// /// 获取指定 的电话号码(如果有)。 /// /// /// 取消操作的通知 public virtual string GetPhoneNumber(User user, CancellationToken cancellationToken = default) { cancellationToken.ThrowIfCancellationRequested(); Check.NotNull(user, nameof(user)); return user.PhoneNumber; } /// /// 获取一个标志,该标志指示指定的 的电话号码是否已被确认。 /// /// /// 取消操作的通知 public virtual Task GetPhoneNumberConfirmedAsync(User user, CancellationToken cancellationToken = default) { cancellationToken.ThrowIfCancellationRequested(); Check.NotNull(user, nameof(user)); return Task.FromResult(user.IsPhoneNumberConfirmed); } /// /// 获取一个标志,该标志指示指定的 的电话号码是否已被确认。 /// /// /// 取消操作的通知 public virtual bool GetPhoneNumberConfirmed(User user, CancellationToken cancellationToken = default) { cancellationToken.ThrowIfCancellationRequested(); Check.NotNull(user, nameof(user)); return user.IsPhoneNumberConfirmed; } /// /// 设置一个标志,指示指定的 的电话号码是否已被确认。 /// /// /// /// 取消操作的通知 public virtual Task SetPhoneNumberConfirmedAsync(User user, bool confirmed, CancellationToken cancellationToken = default) { cancellationToken.ThrowIfCancellationRequested(); Check.NotNull(user, nameof(user)); user.IsPhoneNumberConfirmed = confirmed; return Task.CompletedTask; } /// /// 设置一个标志,指示指定的 的电话号码是否已被确认。 /// /// /// /// 取消操作的通知 public virtual void SetPhoneNumberConfirmed(User user, bool confirmed, CancellationToken cancellationToken = default) { cancellationToken.ThrowIfCancellationRequested(); Check.NotNull(user, nameof(user)); user.IsPhoneNumberConfirmed = confirmed; } #endregion PhoneNumber #region SecurityStamp & TwoFactor /// /// 为指定的 设置提供的安全性 。 /// /// /// /// 取消操作的通知 public virtual Task SetSecurityStampAsync(User user, string stamp, CancellationToken cancellationToken = default) { cancellationToken.ThrowIfCancellationRequested(); Check.NotNull(user, nameof(user)); user.SecurityStamp = stamp; return Task.CompletedTask; } /// /// 为指定的 设置提供的安全性 。 /// /// /// /// 取消操作的通知 public virtual void SetSecurityStamp(User user, string stamp, CancellationToken cancellationToken = default) { cancellationToken.ThrowIfCancellationRequested(); Check.NotNull(user, nameof(user)); user.SecurityStamp = stamp; } /// /// 获取指定 的安全标记。 /// /// /// 取消操作的通知 public virtual Task GetSecurityStampAsync(User user, CancellationToken cancellationToken = default) { cancellationToken.ThrowIfCancellationRequested(); Check.NotNull(user, nameof(user)); return Task.FromResult(user.SecurityStamp); } /// /// 获取指定 的安全标记。 /// /// /// 取消操作的通知 public virtual string GetSecurityStamp(User user, CancellationToken cancellationToken = default) { cancellationToken.ThrowIfCancellationRequested(); Check.NotNull(user, nameof(user)); return user.SecurityStamp; } /// /// 设置一个标志,指示指定的 是否启用了双因素身份验证 /// /// /// /// 取消操作的通知 public virtual Task SetTwoFactorEnabledAsync(User user, bool enabled, CancellationToken cancellationToken = default) { cancellationToken.ThrowIfCancellationRequested(); Check.NotNull(user, nameof(user)); user.IsTwoFactorEnabled = enabled; return Task.CompletedTask; } /// /// 设置一个标志,指示指定的 是否启用了双因素身份验证 /// /// /// /// 取消操作的通知 public virtual void SetTwoFactorEnabled(User user, bool enabled, CancellationToken cancellationToken = default) { cancellationToken.ThrowIfCancellationRequested(); Check.NotNull(user, nameof(user)); user.IsTwoFactorEnabled = enabled; } /// /// 返回一个标志,指示指定的 是否启用了两因素身份验证 /// /// /// 取消操作的通知 public virtual Task GetTwoFactorEnabledAsync(User user, CancellationToken cancellationToken = default) { cancellationToken.ThrowIfCancellationRequested(); Check.NotNull(user, nameof(user)); return Task.FromResult(user.IsTwoFactorEnabled); } /// /// 返回一个标志,指示指定的 是否启用了两因素身份验证 /// /// /// 取消操作的通知 public virtual bool GetTwoFactorEnabled(User user, CancellationToken cancellationToken = default) { cancellationToken.ThrowIfCancellationRequested(); Check.NotNull(user, nameof(user)); return user.IsTwoFactorEnabled; } #endregion SecurityStamp & TwoFactor #region Token /// /// 设置特定用户的 Token /// /// /// /// /// /// 取消操作的通知 public virtual async Task SetTokenAsync(User user, string loginProvider, string name, string value, CancellationToken cancellationToken) { await _unitOfWorkManager.WithUnitOfWorkAsync(async () => { cancellationToken.ThrowIfCancellationRequested(); Check.NotNull(user, nameof(user)); await UserRepository.EnsureCollectionLoadedAsync(user, u => u.Tokens, cancellationToken); var token = user.Tokens.FirstOrDefault(t => t?.LoginProvider == loginProvider && t?.Name == name); if (token == null) { user.Tokens.Add(new UserToken(user, loginProvider, name, value)); } else { token.Value = value; } }); } /// /// 设置特定用户的 Token /// /// /// /// /// /// 取消操作的通知 public virtual void SetToken(User user, string loginProvider, string name, string value, CancellationToken cancellationToken) { _unitOfWorkManager.WithUnitOfWork(() => { cancellationToken.ThrowIfCancellationRequested(); Check.NotNull(user, nameof(user)); UserRepository.EnsureCollectionLoaded(user, u => u.Tokens, cancellationToken); var token = user.Tokens.FirstOrDefault(t => t?.LoginProvider == loginProvider && t?.Name == name); if (token == null) { user.Tokens.Add(new UserToken(user, loginProvider, name, value)); } else { token.Value = value; } }); } /// /// 删除用户的 Token /// /// /// /// /// 取消操作的通知 public virtual async Task RemoveTokenAsync(User user, string loginProvider, string name, CancellationToken cancellationToken) { await _unitOfWorkManager.WithUnitOfWorkAsync(async () => { cancellationToken.ThrowIfCancellationRequested(); Check.NotNull(user, nameof(user)); await UserRepository.EnsureCollectionLoadedAsync(user, u => u.Tokens, cancellationToken); user.Tokens.RemoveAll(t => t.LoginProvider == loginProvider && t.Name == name); }); } /// /// 删除用户的 Token /// /// /// /// /// 取消操作的通知 public void RemoveToken(User user, string loginProvider, string name, CancellationToken cancellationToken) { _unitOfWorkManager.WithUnitOfWork(() => { cancellationToken.ThrowIfCancellationRequested(); Check.NotNull(user, nameof(user)); UserRepository.EnsureCollectionLoaded(user, u => u.Tokens, cancellationToken); user.Tokens.RemoveAll(t => t.LoginProvider == loginProvider && t.Name == name); }); } /// /// 获取用户的 Token /// /// /// /// /// 取消操作的通知 public virtual async Task GetTokenAsync(User user, string loginProvider, string name, CancellationToken cancellationToken) { return await _unitOfWorkManager.WithUnitOfWorkAsync(async () => { cancellationToken.ThrowIfCancellationRequested(); Check.NotNull(user, nameof(user)); await UserRepository.EnsureCollectionLoadedAsync(user, u => u.Tokens, cancellationToken); return user.Tokens.FirstOrDefault(t => t?.LoginProvider == loginProvider && t?.Name == name)?.Value; }); } /// /// 获取用户的 Token /// /// /// /// /// 取消操作的通知 public string GetToken(User user, string loginProvider, string name, CancellationToken cancellationToken) { return _unitOfWorkManager.WithUnitOfWork(() => { cancellationToken.ThrowIfCancellationRequested(); Check.NotNull(user, nameof(user)); UserRepository.EnsureCollectionLoaded(user, u => u.Tokens, cancellationToken); return user.Tokens.FirstOrDefault(t => t?.LoginProvider == loginProvider && t?.Name == name)?.Value; }); } #endregion Token /// /// 尝试在当前租户中查找具有用户名或电子邮件地址的用户。 /// /// public virtual async Task FindByNameOrEmailOrPhoneAsync(string userNameOrEmailOrPhone) { var uep = NormalizeKey(userNameOrEmailOrPhone); return await _unitOfWorkManager.WithUnitOfWorkAsync(async () => { return await UserRepository.FirstOrDefaultAsync( user => (user.NormalizedUserName == uep || user.NormalizedEmailAddress == uep || user.PhoneNumber == uep) ); }); } /// /// 尝试在当前租户中查找具有用户名或电子邮件地址的用户。 /// /// public virtual User FindByNameOrEmailOrPhone(string userNameOrEmailOrPhone) { var uep = NormalizeKey(userNameOrEmailOrPhone); return _unitOfWorkManager.WithUnitOfWork(() => { return UserRepository.FirstOrDefault( user => (user.NormalizedUserName == uep || user.NormalizedEmailAddress == uep || user.PhoneNumber == uep) ); }); } /// /// 尝试在给定租户中查找具有用户名或电子邮件地址的用户。 /// /// /// public virtual async Task FindByNameOrEmailOrPhoneAsync(int? tenantId, string userNameOrEmailOrPhone) { return await _unitOfWorkManager.WithUnitOfWorkAsync(async () => { using (_unitOfWorkManager.Current.SetTenantId(tenantId)) { return await FindByNameOrEmailOrPhoneAsync(userNameOrEmailOrPhone); } }); } /// /// 尝试在给定租户中查找具有用户名或电子邮件地址的用户。 /// /// /// public virtual User FindByNameOrEmailOrPhone(int? tenantId, string userNameOrEmailOrPhone) { return _unitOfWorkManager.WithUnitOfWork(() => { using (_unitOfWorkManager.Current.SetTenantId(tenantId)) { return FindByNameOrEmailOrPhone(userNameOrEmailOrPhone); } }); } public virtual async Task FindByPhoneAsync(string phoneNumber) { return await _unitOfWorkManager.WithUnitOfWorkAsync(async () => { return await UserRepository.FirstOrDefaultAsync(user => (user.PhoneNumber == phoneNumber)); }); } public virtual User FindByPhone(string phoneNumber) { return _unitOfWorkManager.WithUnitOfWork(() => { return UserRepository.FirstOrDefault(user => (user.PhoneNumber == phoneNumber)); }); } public virtual async Task FindByPhoneAsync(int? tenantId, string phoneNumber) { return await _unitOfWorkManager.WithUnitOfWorkAsync(async () => { using (_unitOfWorkManager.Current.SetTenantId(tenantId)) { return await UserRepository.FirstOrDefaultAsync(user => (user.PhoneNumber == phoneNumber)); } }); } public virtual User FindByPhone(int? tenantId, string phoneNumber) { return _unitOfWorkManager.WithUnitOfWork(() => { using (_unitOfWorkManager.Current.SetTenantId(tenantId)) { return UserRepository.FirstOrDefault(user => (user.PhoneNumber == phoneNumber)); } }); } public virtual async Task FindAsync(UserLoginInfo login) { return await _unitOfWorkManager.WithUnitOfWorkAsync(async () => { var userLogin = await _userLoginRepository.FirstOrDefaultAsync( ul => ul.LoginProvider == login.LoginProvider && ul.ProviderKey == login.ProviderKey ); if (userLogin == null) { return null; } return await UserRepository.FirstOrDefaultAsync(u => u.Id == userLogin.UserId); }); } public virtual User Find(UserLoginInfo login) { return _unitOfWorkManager.WithUnitOfWork(() => { var userLogin = _userLoginRepository.FirstOrDefault( ul => ul.LoginProvider == login.LoginProvider && ul.ProviderKey == login.ProviderKey ); if (userLogin == null) { return null; } return UserRepository.FirstOrDefault(u => u.Id == userLogin.UserId); }); } public virtual async Task> FindAllAsync(UserLoginInfo login) { var result = _unitOfWorkManager.WithUnitOfWork(() => { var query = from userLogin in _userLoginRepository.GetAll() join user in UserRepository.GetAll() on userLogin.UserId equals user.Id where userLogin.LoginProvider == login.LoginProvider && userLogin.ProviderKey == login.ProviderKey select user; return query.ToList(); }); return await Task.FromResult(result); } public virtual List FindAll(UserLoginInfo login) { return _unitOfWorkManager.WithUnitOfWork(() => { var query = from userLogin in _userLoginRepository.GetAll() join user in UserRepository.GetAll() on userLogin.UserId equals user.Id where userLogin.LoginProvider == login.LoginProvider && userLogin.ProviderKey == login.ProviderKey select user; return query.ToList(); }); } public virtual async Task FindAsync(int? tenantId, UserLoginInfo login) { var result = _unitOfWorkManager.WithUnitOfWork(() => { using (_unitOfWorkManager.Current.SetTenantId(tenantId)) { var query = from userLogin in _userLoginRepository.GetAll() join user in UserRepository.GetAll() on userLogin.UserId equals user.Id where userLogin.LoginProvider == login.LoginProvider && userLogin.ProviderKey == login.ProviderKey select user; return query.FirstOrDefault(); } }); return await Task.FromResult(result); } public virtual User Find(int? tenantId, UserLoginInfo login) { return _unitOfWorkManager.WithUnitOfWork(() => { using (_unitOfWorkManager.Current.SetTenantId(tenantId)) { var query = from userLogin in _userLoginRepository.GetAll() join user in UserRepository.GetAll() on userLogin.UserId equals user.Id where userLogin.LoginProvider == login.LoginProvider && userLogin.ProviderKey == login.ProviderKey select user; return query.FirstOrDefault(); } }); } public virtual async Task GetUserNameFromDatabaseAsync(long userId) { using var uow = _unitOfWorkManager.Begin(new UnitOfWorkOptions { Scope = TransactionScopeOption.Suppress }); var user = await UserRepository.GetAsync(userId); await uow.CompleteAsync(); return user.UserName; } public string GetUserNameFromDatabase(long userId) { using var uow = _unitOfWorkManager.Begin(new UnitOfWorkOptions { Scope = TransactionScopeOption.Suppress }); var user = UserRepository.Get(userId); uow.Complete(); return user.UserName; } public virtual async Task AddPermissionAsync(User user, PermissionGrantInfo permissionGrant) { await _unitOfWorkManager.WithUnitOfWorkAsync(async () => { if (await HasPermissionAsync(user.Id, permissionGrant)) { return; } await _userPermissionSettingRepository.InsertAsync( new UserPermissionSetting(user.Id) { TenantId = user.TenantId, //UserId = user.Id, Name = permissionGrant.Name, IsGranted = permissionGrant.IsGranted } ); }); } public virtual void AddPermission(User user, PermissionGrantInfo permissionGrant) { _unitOfWorkManager.WithUnitOfWork(() => { if (HasPermission(user.Id, permissionGrant)) { return; } _userPermissionSettingRepository.Insert( new UserPermissionSetting(user.Id) { TenantId = user.TenantId, //UserId = user.Id, Name = permissionGrant.Name, IsGranted = permissionGrant.IsGranted } ); }); } public virtual async Task RemovePermissionAsync(User user, PermissionGrantInfo permissionGrant) { await _unitOfWorkManager.WithUnitOfWorkAsync(async () => { await _userPermissionSettingRepository.DeleteAsync( permissionSetting => permissionSetting.UserId == user.Id && permissionSetting.Name == permissionGrant.Name && permissionSetting.IsGranted == permissionGrant.IsGranted ); }); } public virtual void RemovePermission(User user, PermissionGrantInfo permissionGrant) { _unitOfWorkManager.WithUnitOfWork(() => { _userPermissionSettingRepository.Delete( permissionSetting => permissionSetting.UserId == user.Id && permissionSetting.Name == permissionGrant.Name && permissionSetting.IsGranted == permissionGrant.IsGranted ); }); } public virtual async Task> GetPermissionsAsync(long userId) { return await _unitOfWorkManager.WithUnitOfWorkAsync(async () => { return (await _userPermissionSettingRepository.GetAllListAsync(p => p.UserId == userId)) .Select(p => new PermissionGrantInfo(p.Name, p.IsGranted)) .ToList(); }); } public virtual IList GetPermissions(long userId) { return _unitOfWorkManager.WithUnitOfWork(() => { return (_userPermissionSettingRepository.GetAllList(p => p.UserId == userId)) .Select(p => new PermissionGrantInfo(p.Name, p.IsGranted)) .ToList(); }); } public virtual async Task HasPermissionAsync(long userId, PermissionGrantInfo permissionGrant) { return await _unitOfWorkManager.WithUnitOfWorkAsync(async () => { return await _userPermissionSettingRepository.FirstOrDefaultAsync( p => p.UserId == userId && p.Name == permissionGrant.Name && p.IsGranted == permissionGrant.IsGranted ) != null; }); } public virtual bool HasPermission(long userId, PermissionGrantInfo permissionGrant) { return _unitOfWorkManager.WithUnitOfWork(() => { return _userPermissionSettingRepository.FirstOrDefault( p => p.UserId == userId && p.Name == permissionGrant.Name && p.IsGranted == permissionGrant.IsGranted ) != null; }); } public virtual async Task RemoveAllPermissionSettingsAsync(User user) { await _unitOfWorkManager.WithUnitOfWorkAsync(async () => { await _userPermissionSettingRepository.DeleteAsync(s => s.UserId == user.Id); }); } public virtual void RemoveAllPermissionSettings(User user) { _unitOfWorkManager.WithUnitOfWork(() => { _userPermissionSettingRepository.Delete(s => s.UserId == user.Id); }); } private const string InternalLoginProvider = "[AspNeAbpUserStore]"; private const string AuthenticatorKeyTokenName = "AuthenticatorKey"; private const string TokenValidityKeyProvider = "TokenValidityKeyProvider"; public virtual async Task SetAuthenticatorKeyAsync(User user, string key, CancellationToken cancellationToken) { await SetTokenAsync(user, InternalLoginProvider, AuthenticatorKeyTokenName, key, cancellationToken); } public virtual void SetAuthenticatorKey(User user, string key, CancellationToken cancellationToken) { SetToken(user, InternalLoginProvider, AuthenticatorKeyTokenName, key, cancellationToken); } public virtual async Task GetAuthenticatorKeyAsync(User user, CancellationToken cancellationToken) { return await GetTokenAsync(user, InternalLoginProvider, AuthenticatorKeyTokenName, cancellationToken); } public string GetAuthenticatorKey(User user, CancellationToken cancellationToken) { return GetToken(user, InternalLoginProvider, AuthenticatorKeyTokenName, cancellationToken); } public virtual async Task AddTokenValidityKeyAsync(User user, string tokenValidityKey, DateTime expireDate, CancellationToken cancellationToken = default) { await _unitOfWorkManager.WithUnitOfWorkAsync(async () => { cancellationToken.ThrowIfCancellationRequested(); Check.NotNull(user, nameof(user)); await UserRepository.EnsureCollectionLoadedAsync(user, u => u.Tokens, cancellationToken); user.Tokens.Add(new UserToken(user, TokenValidityKeyProvider, tokenValidityKey, null, expireDate)); }); } public virtual void AddTokenValidityKey(User user, string tokenValidityKey, DateTime expireDate, CancellationToken cancellationToken = default) { _unitOfWorkManager.WithUnitOfWork(() => { cancellationToken.ThrowIfCancellationRequested(); Check.NotNull(user, nameof(user)); UserRepository.EnsureCollectionLoaded(user, u => u.Tokens, cancellationToken); user.Tokens.Add(new UserToken(user, TokenValidityKeyProvider, tokenValidityKey, null, expireDate)); }); } public virtual async Task IsTokenValidityKeyValidAsync(User user, string tokenValidityKey, CancellationToken cancellationToken = default) { return await _unitOfWorkManager.WithUnitOfWorkAsync(async () => { cancellationToken.ThrowIfCancellationRequested(); Check.NotNull(user, nameof(user)); await UserRepository.EnsureCollectionLoadedAsync(user, u => u.Tokens, cancellationToken); return user.Tokens.Any(t => t?.LoginProvider == TokenValidityKeyProvider && t.Name == tokenValidityKey && t.ExpireDate > DateTime.UtcNow); }); } public virtual bool IsTokenValidityKeyValid(User user, string tokenValidityKey, CancellationToken cancellationToken = default) { return _unitOfWorkManager.WithUnitOfWork(() => { cancellationToken.ThrowIfCancellationRequested(); Check.NotNull(user, nameof(user)); UserRepository.EnsureCollectionLoaded(user, u => u.Tokens, cancellationToken); var isValidityKeyValid = user.Tokens.Any(t => t?.LoginProvider == TokenValidityKeyProvider && t.Name == tokenValidityKey && t.ExpireDate > DateTime.UtcNow); user.Tokens.RemoveAll(t => t?.LoginProvider == TokenValidityKeyProvider && t.ExpireDate <= DateTime.UtcNow); return isValidityKeyValid; }); } public virtual async Task RemoveTokenValidityKeyAsync(User user, string tokenValidityKey, CancellationToken cancellationToken = default) { await _unitOfWorkManager.WithUnitOfWorkAsync(async () => { cancellationToken.ThrowIfCancellationRequested(); Check.NotNull(user, nameof(user)); await UserRepository.EnsureCollectionLoadedAsync(user, u => u.Tokens, cancellationToken); user.Tokens.RemoveAll(t => t.LoginProvider == TokenValidityKeyProvider && t.Name == tokenValidityKey); }); } public virtual void RemoveTokenValidityKey(User user, string tokenValidityKey, CancellationToken cancellationToken = default) { _unitOfWorkManager.WithUnitOfWork(() => { cancellationToken.ThrowIfCancellationRequested(); Check.NotNull(user, nameof(user)); UserRepository.EnsureCollectionLoaded(user, u => u.Tokens, cancellationToken); user.Tokens.Remove(user.Tokens.FirstOrDefault(t => t?.LoginProvider == TokenValidityKeyProvider && t.Name == tokenValidityKey) ); }); } protected virtual string NormalizeKey(string key) { return key.ToUpperInvariant(); } }