VzUserManager.cs 51 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513151415151516151715181519152015211522152315241525152615271528152915301531153215331534153515361537153815391540154115421543154415451546154715481549155015511552
  1. using Abp;
  2. using Abp.Authorization;
  3. using Abp.Configuration;
  4. using Abp.Configuration.Startup;
  5. using Abp.Domain.Repositories;
  6. using Abp.Domain.Services;
  7. using Abp.Domain.Uow;
  8. using Abp.Json;
  9. using Abp.Localization;
  10. using Abp.Runtime.Caching;
  11. using Abp.UI;
  12. using Castle.Core.Internal;
  13. using Microsoft.AspNetCore.Identity;
  14. using Microsoft.Extensions.Options;
  15. using Newtonsoft.Json;
  16. using System.Globalization;
  17. using VberZero.Authorization.Roles;
  18. using VberZero.BaseSystem.MultiTenancy;
  19. using VberZero.BaseSystem.Organizations;
  20. using VberZero.BaseSystem.Users;
  21. using VberZero.Caching;
  22. using VberZero.DomainService.AppGuids;
  23. using VberZero.DomainService.Notifications;
  24. using VberZero.IdentityFramework;
  25. using VberZero.Organizations;
  26. using VberZero.Session;
  27. using VberZero.Settings;
  28. using VberZero.Tools.StringModel;
  29. #pragma warning disable CS0162
  30. namespace VberZero.Authorization.Users;
  31. public class VzUserManager : UserManager<User>, IDomainService
  32. {
  33. protected IUserPermissionStore<User> UserPermissionStore
  34. {
  35. get
  36. {
  37. if (!(Store is IUserPermissionStore<User>))
  38. {
  39. throw new AbpException("Store is not IUserPermissionStore");
  40. }
  41. return Store as IUserPermissionStore<User>;
  42. }
  43. }
  44. public ILocalizationManager LocalizationManager { get; set; }
  45. protected string LocalizationSourceName { get; set; }
  46. public IVzSession AbpSession { get; set; }
  47. //public FeatureDependencyContext FeatureDependencyContext { get; set; }
  48. protected VzRoleManager RoleManager { get; }
  49. protected VzUserStore UserStore { get; }
  50. protected IRepository<UserRole, long> UserRoleRepository { get; }
  51. public IMultiTenancyConfig MultiTenancy { get; set; }
  52. private readonly IPermissionManager _permissionManager;
  53. private readonly IUnitOfWorkManager _unitOfWorkManager;
  54. private readonly ICacheManager _cacheManager;
  55. private readonly IRepository<OrganizationUnit, long> _organizationUnitRepository;
  56. private readonly IRepository<UserOrganizationUnit, long> _userOrganizationUnitRepository;
  57. private readonly IOrganizationUnitSettings _organizationUnitSettings;
  58. private readonly ISettingManager _settingManager;
  59. private readonly IOptions<IdentityOptions> _optionsAccessor;
  60. private readonly IAppNotifier _appNotifier;
  61. private readonly IAppGuidManager _appGuidManager;
  62. public VzUserManager(
  63. VzRoleManager roleManager,
  64. VzUserStore userStore,
  65. IOptions<IdentityOptions> optionsAccessor,
  66. IPasswordHasher<User> passwordHasher,
  67. IEnumerable<IUserValidator<User>> userValidators,
  68. IEnumerable<IPasswordValidator<User>> passwordValidators,
  69. ILookupNormalizer keyNormalizer,
  70. IdentityErrorDescriber errors,
  71. IServiceProvider services,
  72. ILogger<UserManager<User>> logger,
  73. IPermissionManager permissionManager,
  74. IUnitOfWorkManager unitOfWorkManager,
  75. ICacheManager cacheManager,
  76. IRepository<OrganizationUnit, long> organizationUnitRepository,
  77. IRepository<UserOrganizationUnit, long> userOrganizationUnitRepository,
  78. IOrganizationUnitSettings organizationUnitSettings,
  79. ISettingManager settingManager, IAppNotifier appNotifier, IAppGuidManager appGuidManager, IRepository<UserRole, long> userRoleRepository)
  80. : base(
  81. userStore,
  82. optionsAccessor,
  83. passwordHasher,
  84. userValidators,
  85. passwordValidators,
  86. keyNormalizer,
  87. errors,
  88. services,
  89. logger)
  90. {
  91. _permissionManager = permissionManager;
  92. _unitOfWorkManager = unitOfWorkManager;
  93. _cacheManager = cacheManager;
  94. _organizationUnitRepository = organizationUnitRepository;
  95. _userOrganizationUnitRepository = userOrganizationUnitRepository;
  96. _organizationUnitSettings = organizationUnitSettings;
  97. _settingManager = settingManager;
  98. _appNotifier = appNotifier;
  99. _appGuidManager = appGuidManager;
  100. UserRoleRepository = userRoleRepository;
  101. _optionsAccessor = optionsAccessor;
  102. UserStore = userStore;
  103. RoleManager = roleManager;
  104. LocalizationManager = NullLocalizationManager.Instance;
  105. LocalizationSourceName = VzConsts.LocalizationSourceName;
  106. AbpSession = NullVzSession.Instance;
  107. }
  108. #region Permission
  109. #region IsGranted
  110. /// <summary>
  111. /// 检查用户权限
  112. /// </summary>
  113. /// <param name="userId"></param>
  114. /// <param name="permissionName"></param>
  115. /// <param name="isOnlyUser"></param>
  116. public virtual async Task<bool> IsGrantedAsync(long userId, string permissionName, bool isOnlyUser = false)
  117. {
  118. return await IsGrantedAsync(userId, _permissionManager.GetPermission(permissionName), isOnlyUser);
  119. }
  120. /// <summary>
  121. /// 检查用户权限
  122. /// </summary>
  123. /// <param name="userId"></param>
  124. /// <param name="permissionName"></param>
  125. /// <param name="isOnlyUser"></param>
  126. public virtual bool IsGranted(long userId, string permissionName, bool isOnlyUser = false)
  127. {
  128. return IsGranted(userId, _permissionManager.GetPermission(permissionName), isOnlyUser);
  129. }
  130. /// <summary>
  131. /// 检查用户权限
  132. /// </summary>
  133. /// <param name="user"></param>
  134. /// <param name="permission"></param>
  135. /// <param name="isOnlyUser"></param>
  136. public virtual Task<bool> IsGrantedAsync(User user, Permission permission, bool isOnlyUser = false)
  137. {
  138. if (user == null)
  139. {
  140. throw new ArgumentNullException(nameof(user));
  141. }
  142. return IsGrantedAsync(user.Id, permission, isOnlyUser);
  143. }
  144. /// <summary>
  145. /// 检查用户权限
  146. /// </summary>
  147. /// <param name="user"></param>
  148. /// <param name="permission"></param>
  149. /// <param name="isOnlyUser"></param>
  150. public virtual bool IsGranted(User user, Permission permission, bool isOnlyUser = false)
  151. {
  152. if (user == null)
  153. {
  154. throw new ArgumentNullException(nameof(user));
  155. }
  156. return IsGranted(user.Id, permission, isOnlyUser);
  157. }
  158. /// <summary>
  159. /// 检查用户权限
  160. /// </summary>
  161. /// <param name="userId"></param>
  162. /// <param name="permission"></param>
  163. /// <param name="isOnlyUser"></param>
  164. public virtual async Task<bool> IsGrantedAsync(long userId, Permission permission, bool isOnlyUser = false)
  165. {
  166. //Check for multi-tenancy side
  167. if (!permission.MultiTenancySides.HasFlag(GetCurrentMultiTenancySide()))
  168. {
  169. return false;
  170. }
  171. //Check for depended features
  172. //if (permission.FeatureDependency != null && GetCurrentMultiTenancySide() == MultiTenancySides.Tenant)
  173. //{
  174. // FeatureDependencyContext.TenantId = GetCurrentTenantId();
  175. // if (!await permission.FeatureDependency.IsSatisfiedAsync(FeatureDependencyContext))
  176. // {
  177. // return false;
  178. // }
  179. //}
  180. //Get cached user permissions
  181. var cacheItem = await GetUserPermissionCacheItemAsync(userId);
  182. if (cacheItem == null)
  183. {
  184. return false;
  185. }
  186. //Check for user-specific value
  187. if (cacheItem.GrantedPermissions.Contains(permission.Name))
  188. {
  189. return true;
  190. }
  191. if (cacheItem.ProhibitedPermissions.Contains(permission.Name))
  192. {
  193. return false;
  194. }
  195. if (isOnlyUser) return false;
  196. //Check for roles
  197. foreach (var roleId in cacheItem.RoleIds)
  198. {
  199. if (await RoleManager.IsGrantedAsync(roleId, permission))
  200. {
  201. return true;
  202. }
  203. }
  204. return false;
  205. }
  206. /// <summary>
  207. /// 检查用户权限
  208. /// </summary>
  209. /// <param name="userId"></param>
  210. /// <param name="permission"></param>
  211. /// <param name="isOnlyUser"></param>
  212. public virtual bool IsGranted(long userId, Permission permission, bool isOnlyUser = false)
  213. {
  214. //Check for multi-tenancy side
  215. if (!permission.MultiTenancySides.HasFlag(GetCurrentMultiTenancySide()))
  216. {
  217. return false;
  218. }
  219. //Check for depended features
  220. //if (permission.FeatureDependency != null && GetCurrentMultiTenancySide() == MultiTenancySides.Tenant)
  221. //{
  222. // FeatureDependencyContext.TenantId = GetCurrentTenantId();
  223. // if (!permission.FeatureDependency.IsSatisfied(FeatureDependencyContext))
  224. // {
  225. // return false;
  226. // }
  227. //}
  228. //Get cached user permissions
  229. var cacheItem = GetUserPermissionCacheItem(userId);
  230. if (cacheItem == null)
  231. {
  232. return false;
  233. }
  234. //Check for user-specific value
  235. if (cacheItem.GrantedPermissions.Contains(permission.Name))
  236. {
  237. return true;
  238. }
  239. if (cacheItem.ProhibitedPermissions.Contains(permission.Name))
  240. {
  241. return false;
  242. }
  243. if (isOnlyUser) return false;
  244. //Check for roles
  245. foreach (var roleId in cacheItem.RoleIds)
  246. {
  247. if (RoleManager.IsGranted(roleId, permission))
  248. {
  249. return true;
  250. }
  251. }
  252. return false;
  253. }
  254. #endregion IsGranted
  255. /// <summary>
  256. /// 获取用户的权限。
  257. /// </summary>
  258. /// <param name="user"></param>
  259. /// <returns></returns>
  260. public virtual async Task<IReadOnlyList<Permission>> GetGrantedPermissionsAsync(User user)
  261. {
  262. var permissionList = new List<Permission>();
  263. foreach (var permission in _permissionManager.GetAllPermissions())
  264. {
  265. if (await IsGrantedAsync(user.Id, permission))
  266. {
  267. permissionList.Add(permission);
  268. }
  269. }
  270. return permissionList;
  271. }
  272. /// <summary>
  273. /// 一次设置用户的所有授予权限。
  274. /// </summary>
  275. /// <param name="user"></param>
  276. /// <param name="permissions"></param>
  277. /// <param name="isRemove">true 移除所有其他权限 false禁止所有其他权限</param>
  278. public virtual async Task SetGrantedPermissionsAsync(User user, IEnumerable<Permission> permissions, bool isRemove = true)
  279. {
  280. var oldPermissions = await GetGrantedPermissionsAsync(user);
  281. var newPermissions = permissions.ToArray();
  282. foreach (var permission in oldPermissions.Where(p => !newPermissions.Contains(p)))
  283. {
  284. if (isRemove)
  285. {
  286. await RemovePermissionAsync(user, permission);
  287. }
  288. else
  289. {
  290. await ProhibitPermissionAsync(user, permission);
  291. }
  292. }
  293. foreach (var permission in newPermissions.Where(p => !oldPermissions.Contains(p)))
  294. {
  295. await GrantPermissionAsync(user, permission);
  296. }
  297. }
  298. /// <summary>
  299. /// 禁止用户的所有权限。
  300. /// </summary>
  301. /// <param name="user"></param>
  302. public async Task ProhibitAllPermissionsAsync(User user)
  303. {
  304. foreach (var permission in _permissionManager.GetAllPermissions())
  305. {
  306. await ProhibitPermissionAsync(user, permission);
  307. }
  308. }
  309. /// <summary>
  310. ///
  311. /// </summary>
  312. /// <param name="user">User</param>
  313. public async Task ResetAllPermissionsAsync(User user)
  314. {
  315. await UserPermissionStore.RemoveAllPermissionSettingsAsync(user);
  316. }
  317. /// <summary>
  318. /// 重置用户的所有权限设置。
  319. /// 它删除用户的所有权限设置。 用户将根据他的角色拥有权限。
  320. /// 此方法不会禁止所有权限。 为此,请使用 <see cref="ProhibitAllPermissionsAsync"/>。
  321. /// </summary>
  322. /// <param name="user">User</param>
  323. public void ResetAllPermissions(User user)
  324. {
  325. UserPermissionStore.RemoveAllPermissionSettings(user);
  326. }
  327. /// <summary>
  328. /// 如果尚未授予用户权限,则授予该用户权限。
  329. /// </summary>
  330. /// <param name="user">User</param>
  331. /// <param name="permission">Permission</param>
  332. public virtual async Task GrantPermissionAsync(User user, Permission permission)
  333. {
  334. await UserPermissionStore.RemovePermissionAsync(user, new PermissionGrantInfo(permission.Name, false));
  335. if (await IsGrantedAsync(user.Id, permission))
  336. {
  337. return;
  338. }
  339. await UserPermissionStore.AddPermissionAsync(user, new PermissionGrantInfo(permission.Name, true));
  340. }
  341. /// <summary>
  342. /// 如果授予用户权限,则移除该权限。
  343. /// </summary>
  344. /// <param name="user">User</param>
  345. /// <param name="permission">Permission</param>
  346. public virtual async Task RemovePermissionAsync(User user, Permission permission)
  347. {
  348. if (!await IsGrantedAsync(user.Id, permission, true))
  349. {
  350. return;
  351. }
  352. await UserPermissionStore.RemovePermissionAsync(user, new PermissionGrantInfo(permission.Name, true));
  353. }
  354. /// <summary>
  355. /// 如果授予用户权限,则禁止该权限。
  356. /// </summary>
  357. /// <param name="user">User</param>
  358. /// <param name="permission">Permission</param>
  359. public virtual async Task ProhibitPermissionAsync(User user, Permission permission)
  360. {
  361. await UserPermissionStore.RemovePermissionAsync(user, new PermissionGrantInfo(permission.Name, true));
  362. if (!await IsGrantedAsync(user.Id, permission))
  363. {
  364. return;
  365. }
  366. await UserPermissionStore.AddPermissionAsync(user, new PermissionGrantInfo(permission.Name, false));
  367. }
  368. private async Task<UserPermissionCacheItem> GetUserPermissionCacheItemAsync(long userId)
  369. {
  370. var cacheKey = userId + "@" + (GetCurrentTenantId() ?? 0);
  371. return await _cacheManager.GetUserPermissionCache().GetAsync(cacheKey, async () =>
  372. {
  373. var user = await FindByIdAsync(userId.ToString());
  374. if (user == null)
  375. {
  376. return null;
  377. }
  378. var newCacheItem = new UserPermissionCacheItem(userId);
  379. foreach (var roleName in await GetRolesAsync(user))
  380. {
  381. newCacheItem.RoleIds.Add((await RoleManager.GetRoleByNameAsync(roleName)).Id);
  382. }
  383. foreach (var permissionInfo in await UserPermissionStore.GetPermissionsAsync(userId))
  384. {
  385. if (permissionInfo.IsGranted)
  386. {
  387. newCacheItem.GrantedPermissions.Add(permissionInfo.Name);
  388. }
  389. else
  390. {
  391. newCacheItem.ProhibitedPermissions.Add(permissionInfo.Name);
  392. }
  393. }
  394. return newCacheItem;
  395. });
  396. }
  397. private UserPermissionCacheItem GetUserPermissionCacheItem(long userId)
  398. {
  399. var cacheKey = userId + "@" + (GetCurrentTenantId() ?? 0);
  400. return _cacheManager.GetUserPermissionCache()!.Get(cacheKey, () =>
  401. {
  402. var user = UserStore.FindById(userId.ToString());
  403. if (user == null)
  404. {
  405. return null;
  406. }
  407. var newCacheItem = new UserPermissionCacheItem(userId);
  408. foreach (var roleName in UserStore.GetRoles(user))
  409. {
  410. newCacheItem.RoleIds.Add((RoleManager.GetRoleByName(roleName)).Id);
  411. }
  412. foreach (var permissionInfo in UserPermissionStore.GetPermissions(userId))
  413. {
  414. if (permissionInfo.IsGranted)
  415. {
  416. newCacheItem.GrantedPermissions.Add(permissionInfo.Name);
  417. }
  418. else
  419. {
  420. newCacheItem.ProhibitedPermissions.Add(permissionInfo.Name);
  421. }
  422. }
  423. return newCacheItem;
  424. });
  425. }
  426. #endregion Permission
  427. #region CURD
  428. #region Query
  429. public virtual Task<User> FindByNameOrEmailOrPhoneAsync(string userNameOrEmailOrPhone)
  430. {
  431. return UserStore.FindByNameOrEmailOrPhoneAsync(userNameOrEmailOrPhone);
  432. }
  433. public virtual User FindByNameOrEmailOrPhone(string userNameOrEmailOrPhone)
  434. {
  435. return UserStore.FindByNameOrEmailOrPhone(userNameOrEmailOrPhone);
  436. }
  437. public virtual Task<User> FindByNameOrEmailOrPhoneAsync(int? tenantId, string userNameOrEmailOrPhone)
  438. {
  439. return UserStore.FindByNameOrEmailOrPhoneAsync(tenantId, userNameOrEmailOrPhone);
  440. }
  441. public virtual User FindByNameOrEmailOrPhone(int? tenantId, string userNameOrEmailOrPhone)
  442. {
  443. return UserStore.FindByNameOrEmailOrPhone(tenantId, userNameOrEmailOrPhone);
  444. }
  445. public virtual Task<List<User>> FindAllAsync(UserLoginInfo login)
  446. {
  447. return UserStore.FindAllAsync(login);
  448. }
  449. public virtual List<User> FindAll(UserLoginInfo login)
  450. {
  451. return UserStore.FindAll(login);
  452. }
  453. public virtual Task<User> FindAsync(int? tenantId, UserLoginInfo login)
  454. {
  455. return UserStore.FindAsync(tenantId, login);
  456. }
  457. public virtual User Find(int? tenantId, UserLoginInfo login)
  458. {
  459. return UserStore.Find(tenantId, login);
  460. }
  461. /// <summary>
  462. /// 通过给定的 id 获取用户。
  463. /// 如果没有找到具有给定 id 的用户,则抛出异常。
  464. /// </summary>
  465. /// <param name="userId"></param>
  466. /// <returns></returns>
  467. public virtual async Task<User> GetUserByIdAsync(long userId)
  468. {
  469. var user = await FindByIdAsync(userId.ToString());
  470. if (user == null)
  471. {
  472. throw new AbpException("There is no user with id: " + userId);
  473. }
  474. return user;
  475. }
  476. /// <summary>
  477. /// 通过给定的 id 获取用户。
  478. /// 如果没有找到具有给定 id 的用户,则抛出异常。
  479. /// </summary>
  480. /// <param name="userId"></param>
  481. /// <returns></returns>
  482. public virtual User GetUserById(long userId)
  483. {
  484. var user = UserStore.FindById(userId.ToString());
  485. if (user == null)
  486. {
  487. throw new AbpException("There is no user with id: " + userId);
  488. }
  489. return user;
  490. }
  491. #endregion Query
  492. public virtual async Task<User> CreateUser(User user, string[] roles, string[] permissionNames)
  493. {
  494. user.TenantId = AbpSession.TenantId;
  495. user.IsEmailConfirmed = true;
  496. user.Name = user.Surname;
  497. //var password = await _settingManager.GetSettingValueAsync(VzSettingNames.UserDefaultPassword);
  498. //CheckErrors(await CreateAsync(user,password));
  499. CheckErrors(await CreateAsync(user));
  500. await _unitOfWorkManager.Current.SaveChangesAsync();
  501. var roleList = roles?.ToList() ?? new List<string>();
  502. roleList.Add(VzStaticRoleNames.Tenants.Default);
  503. roles = roleList.Distinct().ToArray();
  504. if (roles is { Length: > 0 })
  505. {
  506. CheckErrors(await SetRolesAsync(user, roles));
  507. }
  508. if (permissionNames is { Length: > 0 })
  509. {
  510. var grantedPermissions = _permissionManager.GetAllPermissions().Where(p => permissionNames.Contains(p.Name));
  511. await SetGrantedPermissionsAsync(user, grantedPermissions);
  512. }
  513. await _appNotifier.SubscriptionNotifications(user);
  514. return user;
  515. }
  516. /// <summary>
  517. /// 创建用户
  518. /// </summary>
  519. /// <param name="user"></param>
  520. /// <returns></returns>
  521. public override async Task<IdentityResult> CreateAsync(User user)
  522. {
  523. var result = await CheckDuplicateUsernameOrEmailOrPhoneAsync(user.Id, user.UserName, user.EmailAddress, user.PhoneNumber);
  524. if (!result.Succeeded)
  525. {
  526. return result;
  527. }
  528. var tenantId = GetCurrentTenantId();
  529. if (tenantId.HasValue && !user.TenantId.HasValue)
  530. {
  531. user.TenantId = tenantId.Value;
  532. }
  533. await InitializeOptionsAsync(user.TenantId);
  534. user.UserName = await BindAccount(user.AccountType, user.AccountNo);
  535. user.AvatarPath = user.AvatarPath.Empty() ? $"/img/avatar/{user.Gender.ToInt()}_{new Random().Next(1, 6)}.png" : user.AvatarPath;
  536. var password = await _settingManager.GetSettingValueAsync(VzSettingNames.UserDefaultPassword);
  537. user.Password = PasswordHasher.HashPassword(user, password);
  538. user.SetNormalizedNames();
  539. return await base.CreateAsync(user);
  540. }
  541. /// <summary>
  542. /// 修改用户
  543. /// </summary>
  544. /// <param name="user"></param>
  545. /// <returns></returns>
  546. /// <exception cref="UserFriendlyException"></exception>
  547. public override async Task<IdentityResult> UpdateAsync(User user)
  548. {
  549. if (user.UserName == User.AdminUserName && AbpSession.GetUserName() != User.SystemUserName)
  550. {
  551. throw new UserFriendlyException(string.Format(L("CanNotUpdateAdminUser"), User.AdminUserName));
  552. }
  553. if (user.UserName == User.SystemUserName && AbpSession.GetUserName() != User.AdminUserName)
  554. {
  555. throw new UserFriendlyException(string.Format(L("CanNotUpdateAdminUser"), User.SystemUserName));
  556. }
  557. var result = await CheckDuplicateUsernameOrEmailOrPhoneAsync(user.Id, user.UserName, user.EmailAddress, user.PhoneNumber);
  558. if (!result.Succeeded)
  559. {
  560. return result;
  561. }
  562. //Admin user's username can not be changed!
  563. if (user.UserName != User.AdminUserName && (await GetOldUserNameAsync(user.Id)) == User.AdminUserName)
  564. {
  565. throw new UserFriendlyException(string.Format(L("CanNotRenameAdminUser"), User.AdminUserName));
  566. }
  567. //System user's username can not be changed!
  568. if (user.UserName != User.SystemUserName && (await GetOldUserNameAsync(user.Id)) == User.SystemUserName)
  569. {
  570. throw new UserFriendlyException(string.Format(L("CanNotRenameAdminUser"), User.SystemUserName));
  571. }
  572. return await base.UpdateAsync(user);
  573. }
  574. // Microsoft.AspNetCore.Identity.UserManager doesn't have required sync version for method calls in this function
  575. //public override IdentityResult Update(User user)
  576. //{
  577. // var result = CheckDuplicateUsernameOrEmailAddress(user.Id, user.UserName, user.EmailAddress);
  578. // if (!result.Succeeded)
  579. // {
  580. // return result;
  581. // }
  582. // //Admin user's username can not be changed!
  583. // if (user.UserName != UserBase.AdminUserName)
  584. // {
  585. // if ((GetOldUserName(user.Id)) == UserBase.AdminUserName)
  586. // {
  587. // throw new UserFriendlyException(string.Format(L("CanNotRenameAdminUser"), UserBase.AdminUserName));
  588. // }
  589. // }
  590. // return base.Update(user);
  591. //}
  592. /// <summary>
  593. /// 删除用户
  594. /// </summary>
  595. /// <param name="user"></param>
  596. /// <returns></returns>
  597. /// <exception cref="UserFriendlyException"></exception>
  598. public override async Task<IdentityResult> DeleteAsync(User user)
  599. {
  600. if (user.UserName == User.AdminUserName || user.UserName == User.SystemUserName)
  601. {
  602. throw new UserFriendlyException(string.Format(L("CanNotDeleteAdminUser"), User.AdminUserName));
  603. }
  604. return await base.DeleteAsync(user);
  605. }
  606. // Microsoft.AspNetCore.Identity.UserManager doesn't have required sync version for method calls in this function
  607. //public override IdentityResult Delete(User user)
  608. //{
  609. // if (user.UserName == UserBase.AdminUserName)
  610. // {
  611. // throw new UserFriendlyException(string.Format(L("CanNotDeleteAdminUser"), UserBase.AdminUserName));
  612. // }
  613. // return base.Delete(user);
  614. //}
  615. protected virtual async Task<string> BindAccount(VzDefinition.AccountType accountType, string accountNo)
  616. {
  617. string userName = "";
  618. if (accountType == VzDefinition.AccountType.System)
  619. {
  620. var guid = await _appGuidManager.GetGuidFromFileAsync(AppGuidType.System);
  621. CheckGuid(guid);
  622. userName = "S" + guid;
  623. }
  624. else if (accountType == VzDefinition.AccountType.Client)
  625. {
  626. var guid = await _appGuidManager.GetGuidFromFileAsync(AppGuidType.Client);
  627. CheckGuid(guid);
  628. userName = "C" + guid;
  629. /*绑定账号。。。 */
  630. if (!string.IsNullOrEmpty(accountNo))
  631. {
  632. }
  633. }
  634. else
  635. ThrowError("InvalidUserType");
  636. return userName;
  637. }
  638. protected virtual int CheckGuid(int? guid)
  639. {
  640. if (guid == null || guid == 0)
  641. {
  642. ThrowError("GetGuidNoError");
  643. return 0;
  644. }
  645. return (int)guid;
  646. }
  647. protected virtual void CheckErrors(string error)
  648. {
  649. throw new UserFriendlyException(error);
  650. }
  651. protected virtual void CheckErrors(IdentityResult identityResult)
  652. {
  653. identityResult.CheckErrors(LocalizationManager);
  654. }
  655. /// <summary>
  656. /// 抛出错误
  657. /// </summary>
  658. /// <param name="err"></param>
  659. /// <param name="isLocalization">是否要本地化</param>
  660. protected virtual void ThrowError(string err, bool isLocalization = true)
  661. {
  662. CheckErrors(isLocalization ? L(err) : err);
  663. }
  664. #endregion CURD
  665. /// <summary>
  666. /// 查询用户的租户名(用户名,邮箱,手机号需要唯一)
  667. /// </summary>
  668. /// <param name="userNameOrEmailOrPhone"></param>
  669. /// <returns></returns>
  670. public async Task<string> GetTenancyNameAsync(string userNameOrEmailOrPhone)
  671. {
  672. if (!VzConsts.MultiTenancyEnabled)
  673. {
  674. return Tenant.DefaultTenantName;
  675. }
  676. var tenancyName = await UserStore.GetTenancyNameAsync(userNameOrEmailOrPhone);
  677. return tenancyName;
  678. }
  679. /// <summary>
  680. /// 查询用户的租户名(用户名,邮箱,手机号需要唯一)
  681. /// </summary>
  682. /// <param name="userNameOrEmailOrPhone"></param>
  683. /// <returns></returns>
  684. public string GetTenancyName(string userNameOrEmailOrPhone)
  685. {
  686. if (!VzConsts.MultiTenancyEnabled)
  687. {
  688. return Tenant.DefaultTenantName;
  689. }
  690. var tenancyName = UserStore.GetTenancyName
  691. (userNameOrEmailOrPhone);
  692. return tenancyName;
  693. }
  694. /// <summary>
  695. /// 修改密码
  696. /// </summary>
  697. /// <param name="user"></param>
  698. /// <param name="newPassword"></param>
  699. /// <returns></returns>
  700. public virtual async Task<IdentityResult> ChangePasswordAsync(User user, string newPassword)
  701. {
  702. var errors = new List<IdentityError>();
  703. foreach (var validator in PasswordValidators)
  704. {
  705. var validationResult = await validator.ValidateAsync(this, user, newPassword);
  706. if (!validationResult.Succeeded)
  707. {
  708. errors.AddRange(validationResult.Errors);
  709. }
  710. }
  711. if (errors.Any())
  712. {
  713. return IdentityResult.Failed(errors.ToArray());
  714. }
  715. await UserStore.SetPasswordHashAsync(user, PasswordHasher.HashPassword(user, newPassword));
  716. await UpdateSecurityStampAsync(user);
  717. return IdentityResult.Success;
  718. }
  719. // IPasswordValidator doesn't have a sync version of Validate(...)
  720. //public virtual IdentityResult ChangePassword(User user, string newPassword)
  721. //{
  722. // var errors = new List<IdentityError>();
  723. // foreach (var validator in PasswordValidators)
  724. // {
  725. // var validationResult = validator.Validate(this, user, newPassword);
  726. // if (!validationResult.Succeeded)
  727. // {
  728. // errors.AddRange(validationResult.Errors);
  729. // }
  730. // }
  731. // if (errors.Any())
  732. // {
  733. // return IdentityResult.Failed(errors.ToArray());
  734. // }
  735. // UserStore.SetPasswordHash(user, PasswordHasher.HashPassword(user, newPassword));
  736. // return IdentityResult.Success;
  737. //}
  738. /// <summary>
  739. /// 检查用户名、邮箱、手机号的唯一性
  740. /// </summary>
  741. /// <param name="expectedUserId"></param>
  742. /// <param name="userName"></param>
  743. /// <param name="emailAddress"></param>
  744. /// <param name="phoneNumber"></param>
  745. /// <returns></returns>
  746. /// <exception cref="UserFriendlyException"></exception>
  747. public virtual async Task<IdentityResult> CheckDuplicateUsernameOrEmailOrPhoneAsync(long? expectedUserId,
  748. string userName, string emailAddress = "", string phoneNumber = "")
  749. {
  750. using (_unitOfWorkManager.Current.DisableFilter(AbpDataFilters.MayHaveTenant))
  751. {
  752. var user = (await FindByNameAsync(userName));
  753. if (user != null && user.Id != expectedUserId)
  754. {
  755. throw new UserFriendlyException(string.Format(L("Identity.DuplicateUserName"), userName));
  756. }
  757. if (!emailAddress.IsNullOrEmpty())
  758. {
  759. user = (await FindByEmailAsync(emailAddress));
  760. if (user != null && user.Id != expectedUserId)
  761. {
  762. throw new UserFriendlyException(string.Format(L("Identity.DuplicateEmail"), emailAddress));
  763. }
  764. }
  765. if (!phoneNumber.IsNullOrEmpty())
  766. {
  767. user = (await UserStore.FindByPhoneAsync(phoneNumber));
  768. if (user != null && user.Id != expectedUserId)
  769. {
  770. throw new UserFriendlyException(string.Format(L("Identity.DuplicatePhoneNumber"), phoneNumber));
  771. }
  772. }
  773. return IdentityResult.Success;
  774. }
  775. }
  776. //public override async Task<IList<User>> GetUsersInRoleAsync(string roleName)
  777. //{
  778. // var role = await RoleManager.GetRoleByNameAsync(roleName);
  779. // var userIds = await UserRoleRepository.GetAll().Where(a => a.RoleId == role.Id).Select(a => a.UserId).ToListAsync();
  780. // var users = await UserStore.UserRepository.GetAllListAsync(a => userIds.Contains(a.Id));
  781. // return users;
  782. //}
  783. public virtual async Task<IdentityResult> SetRolesAsync(User user, string[] roleNames)
  784. {
  785. if ((user.UserName == User.AdminUserName || user.UserName == User.SystemUserName) && !roleNames.Contains(VzStaticRoleNames.Tenants.Admin))
  786. {
  787. throw new UserFriendlyException(L("AdminRoleCannotRemoveFromAdminUser"));
  788. }
  789. //if (!roleNames.Contains(VzStaticRoleNames.Tenants.Default))
  790. //{
  791. // throw new UserFriendlyException(L("DefaultRoleCannotRemoveUser"));
  792. //}
  793. await UserStore.UserRepository.EnsureCollectionLoadedAsync(user, u => u.Roles);
  794. //Remove from removed roles
  795. foreach (var userRole in user.Roles.ToList())
  796. {
  797. var role = await RoleManager.FindByIdAsync(userRole.RoleId.ToString());
  798. if (role?.Name == VzStaticRoleNames.Tenants.Default)
  799. {
  800. continue;
  801. }
  802. if (role != null && roleNames.All(roleName => role.Name != roleName))
  803. {
  804. var result = await RemoveFromRoleAsync(user, role.Name);
  805. if (!result.Succeeded)
  806. {
  807. return result;
  808. }
  809. }
  810. }
  811. //Add to added roles
  812. foreach (var roleName in roleNames)
  813. {
  814. var role = await RoleManager.GetRoleByNameAsync(roleName);
  815. if (user.Roles.All(ur => ur.RoleId != role.Id))
  816. {
  817. var result = await AddToRoleAsync(user, roleName);
  818. if (!result.Succeeded)
  819. {
  820. return result;
  821. }
  822. }
  823. }
  824. return IdentityResult.Success;
  825. }
  826. public override async Task<IdentityResult> RemoveFromRoleAsync(User user, string roleName)
  827. {
  828. ThrowIfDisposed();
  829. if (user == null)
  830. {
  831. throw new ArgumentNullException(nameof(user));
  832. }
  833. try
  834. {
  835. var role = await RoleManager.GetRoleByNameAsync(roleName);
  836. var userRole = await UserRoleRepository.FirstOrDefaultAsync(a => a.UserId == user.Id && a.RoleId == role.Id);
  837. if (userRole != null)
  838. {
  839. await UserRoleRepository.DeleteAsync(userRole);
  840. return IdentityResult.Success;
  841. }
  842. return IdentityResult.Failed(new IdentityError() { Description = "用户没有此角色!" });
  843. }
  844. catch (Exception e)
  845. {
  846. return IdentityResult.Failed(new IdentityError() { Description = e.Message });
  847. }
  848. }
  849. #region OrganizationUnit
  850. public virtual async Task<bool> IsInOrganizationUnitAsync(long userId, long ouId)
  851. {
  852. return await _unitOfWorkManager.WithUnitOfWorkAsync(async () =>
  853. await IsInOrganizationUnitAsync(
  854. await GetUserByIdAsync(userId),
  855. await _organizationUnitRepository.GetAsync(ouId)
  856. )
  857. );
  858. }
  859. public virtual async Task<bool> IsInOrganizationUnitAsync(User user, OrganizationUnit ou)
  860. {
  861. return await _unitOfWorkManager.WithUnitOfWorkAsync(async () =>
  862. {
  863. return await _userOrganizationUnitRepository.CountAsync(uou =>
  864. uou.UserId == user.Id && uou.OrganizationUnitId == ou.Id
  865. ) > 0;
  866. });
  867. }
  868. public virtual bool IsInOrganizationUnit(User user, OrganizationUnit ou)
  869. {
  870. return _unitOfWorkManager.WithUnitOfWork(() =>
  871. {
  872. return _userOrganizationUnitRepository.Count(uou =>
  873. uou.UserId == user.Id && uou.OrganizationUnitId == ou.Id
  874. ) > 0;
  875. });
  876. }
  877. public virtual async Task AddToOrganizationUnitAsync(long userId, long ouId)
  878. {
  879. await _unitOfWorkManager.WithUnitOfWorkAsync(async () =>
  880. {
  881. await AddToOrganizationUnitAsync(
  882. await GetUserByIdAsync(userId),
  883. await _organizationUnitRepository.GetAsync(ouId)
  884. );
  885. });
  886. }
  887. public virtual async Task AddToOrganizationUnitAsync(User user, OrganizationUnit ou)
  888. {
  889. await _unitOfWorkManager.WithUnitOfWorkAsync(async () =>
  890. {
  891. var currentOus = await GetOrganizationUnitsAsync(user);
  892. if (currentOus.Any(cou => cou.Id == ou.Id))
  893. {
  894. return;
  895. }
  896. await CheckMaxUserOrganizationUnitMembershipCountAsync(user.TenantId, currentOus.Count + 1);
  897. await _userOrganizationUnitRepository.InsertAsync(new UserOrganizationUnit(user.TenantId, user.Id,
  898. ou.Id));
  899. });
  900. }
  901. public virtual void AddToOrganizationUnit(User user, OrganizationUnit ou)
  902. {
  903. _unitOfWorkManager.WithUnitOfWork(() =>
  904. {
  905. var currentOus = GetOrganizationUnits(user);
  906. if (currentOus.Any(cou => cou.Id == ou.Id))
  907. {
  908. return;
  909. }
  910. CheckMaxUserOrganizationUnitMembershipCount(user.TenantId, currentOus.Count + 1);
  911. _userOrganizationUnitRepository.Insert(new UserOrganizationUnit(user.TenantId, user.Id, ou.Id));
  912. });
  913. }
  914. public virtual async Task RemoveFromOrganizationUnitAsync(long userId, long ouId)
  915. {
  916. await _unitOfWorkManager.WithUnitOfWorkAsync(async () =>
  917. {
  918. await RemoveFromOrganizationUnitAsync(
  919. await GetUserByIdAsync(userId),
  920. await _organizationUnitRepository.GetAsync(ouId)
  921. );
  922. });
  923. }
  924. public virtual async Task RemoveFromOrganizationUnitAsync(User user, OrganizationUnit ou)
  925. {
  926. await _unitOfWorkManager.WithUnitOfWorkAsync(async () =>
  927. {
  928. await _userOrganizationUnitRepository.DeleteAsync(uou =>
  929. uou.UserId == user.Id && uou.OrganizationUnitId == ou.Id
  930. );
  931. });
  932. }
  933. public virtual void RemoveFromOrganizationUnit(User user, OrganizationUnit ou)
  934. {
  935. _unitOfWorkManager.WithUnitOfWork(() =>
  936. {
  937. _userOrganizationUnitRepository.Delete(
  938. uou => uou.UserId == user.Id && uou.OrganizationUnitId == ou.Id
  939. );
  940. });
  941. }
  942. public virtual async Task SetOrganizationUnitsAsync(long userId, params long[] organizationUnitIds)
  943. {
  944. await SetOrganizationUnitsAsync(
  945. await GetUserByIdAsync(userId),
  946. organizationUnitIds
  947. );
  948. }
  949. private async Task CheckMaxUserOrganizationUnitMembershipCountAsync(int? tenantId, int requestedCount)
  950. {
  951. var maxCount = await _organizationUnitSettings.GetMaxUserMembershipCountAsync(tenantId);
  952. if (requestedCount > maxCount)
  953. {
  954. throw new AbpException($"Can not set more than {maxCount} organization unit for a user!");
  955. }
  956. }
  957. private void CheckMaxUserOrganizationUnitMembershipCount(int? tenantId, int requestedCount)
  958. {
  959. var maxCount = _organizationUnitSettings.GetMaxUserMembershipCount(tenantId);
  960. if (requestedCount > maxCount)
  961. {
  962. throw new AbpException($"Can not set more than {maxCount} organization unit for a user!");
  963. }
  964. }
  965. public virtual async Task SetOrganizationUnitsAsync(User user, params long[] organizationUnitIds)
  966. {
  967. await _unitOfWorkManager.WithUnitOfWorkAsync(async () =>
  968. {
  969. if (organizationUnitIds == null)
  970. {
  971. organizationUnitIds = new long[0];
  972. }
  973. await CheckMaxUserOrganizationUnitMembershipCountAsync(user.TenantId, organizationUnitIds.Length);
  974. var currentOus = await GetOrganizationUnitsAsync(user);
  975. //Remove from removed OUs
  976. foreach (var currentOu in currentOus)
  977. {
  978. if (!organizationUnitIds.Contains(currentOu.Id))
  979. {
  980. await RemoveFromOrganizationUnitAsync(user, currentOu);
  981. }
  982. }
  983. await _unitOfWorkManager.Current.SaveChangesAsync();
  984. //Add to added OUs
  985. foreach (var organizationUnitId in organizationUnitIds)
  986. {
  987. if (currentOus.All(ou => ou.Id != organizationUnitId))
  988. {
  989. await AddToOrganizationUnitAsync(
  990. user,
  991. await _organizationUnitRepository.GetAsync(organizationUnitId)
  992. );
  993. }
  994. }
  995. });
  996. }
  997. public virtual void SetOrganizationUnits(User user, params long[] organizationUnitIds)
  998. {
  999. _unitOfWorkManager.WithUnitOfWork(() =>
  1000. {
  1001. if (organizationUnitIds == null)
  1002. {
  1003. organizationUnitIds = new long[0];
  1004. }
  1005. CheckMaxUserOrganizationUnitMembershipCount(user.TenantId, organizationUnitIds.Length);
  1006. var currentOus = GetOrganizationUnits(user);
  1007. //Remove from removed OUs
  1008. foreach (var currentOu in currentOus)
  1009. {
  1010. if (!organizationUnitIds.Contains(currentOu.Id))
  1011. {
  1012. RemoveFromOrganizationUnit(user, currentOu);
  1013. }
  1014. }
  1015. //Add to added OUs
  1016. foreach (var organizationUnitId in organizationUnitIds)
  1017. {
  1018. if (currentOus.All(ou => ou.Id != organizationUnitId))
  1019. {
  1020. AddToOrganizationUnit(
  1021. user,
  1022. _organizationUnitRepository.Get(organizationUnitId)
  1023. );
  1024. }
  1025. }
  1026. });
  1027. }
  1028. public virtual async Task<List<OrganizationUnit>> GetOrganizationUnitsAsync(User user)
  1029. {
  1030. var result = _unitOfWorkManager.WithUnitOfWork(() =>
  1031. {
  1032. var query = from uou in _userOrganizationUnitRepository.GetAll()
  1033. join ou in _organizationUnitRepository.GetAll() on uou.OrganizationUnitId equals ou.Id
  1034. where uou.UserId == user.Id
  1035. select ou;
  1036. return query.ToList();
  1037. });
  1038. return await Task.FromResult(result);
  1039. }
  1040. public virtual List<OrganizationUnit> GetOrganizationUnits(User user)
  1041. {
  1042. return _unitOfWorkManager.WithUnitOfWork(() =>
  1043. {
  1044. var query = from uou in _userOrganizationUnitRepository.GetAll()
  1045. join ou in _organizationUnitRepository.GetAll() on uou.OrganizationUnitId equals ou.Id
  1046. where uou.UserId == user.Id
  1047. select ou;
  1048. return query.ToList();
  1049. });
  1050. }
  1051. public virtual async Task<List<User>> GetUsersInOrganizationUnitAsync(
  1052. OrganizationUnit organizationUnit,
  1053. bool includeChildren = false)
  1054. {
  1055. var result = _unitOfWorkManager.WithUnitOfWork(() =>
  1056. {
  1057. if (!includeChildren)
  1058. {
  1059. var query = from uou in _userOrganizationUnitRepository.GetAll()
  1060. join user in Users on uou.UserId equals user.Id
  1061. where uou.OrganizationUnitId == organizationUnit.Id
  1062. select user;
  1063. return query.ToList();
  1064. }
  1065. else
  1066. {
  1067. var query = from uou in _userOrganizationUnitRepository.GetAll()
  1068. join user in Users on uou.UserId equals user.Id
  1069. join ou in _organizationUnitRepository.GetAll() on uou.OrganizationUnitId equals ou.Id
  1070. where ou.Path.StartsWith(organizationUnit.Path)
  1071. select user;
  1072. return query.ToList();
  1073. }
  1074. });
  1075. return await Task.FromResult(result);
  1076. }
  1077. public virtual List<User> GetUsersInOrganizationUnit(
  1078. OrganizationUnit organizationUnit,
  1079. bool includeChildren = false)
  1080. {
  1081. return _unitOfWorkManager.WithUnitOfWork(() =>
  1082. {
  1083. if (!includeChildren)
  1084. {
  1085. var query = from uou in _userOrganizationUnitRepository.GetAll()
  1086. join user in Users on uou.UserId equals user.Id
  1087. where uou.OrganizationUnitId == organizationUnit.Id
  1088. select user;
  1089. return query.ToList();
  1090. }
  1091. else
  1092. {
  1093. var query = from uou in _userOrganizationUnitRepository.GetAll()
  1094. join user in Users on uou.UserId equals user.Id
  1095. join ou in _organizationUnitRepository.GetAll() on uou.OrganizationUnitId equals ou.Id
  1096. where ou.Path.StartsWith(organizationUnit.Path)
  1097. select user;
  1098. return query.ToList();
  1099. }
  1100. });
  1101. }
  1102. #endregion OrganizationUnit
  1103. public virtual async Task InitializeOptionsAsync(int? tenantId)
  1104. {
  1105. Options = JsonConvert.DeserializeObject<IdentityOptions>(_optionsAccessor.Value.ToJsonString());
  1106. //Lockout
  1107. if (Options != null)
  1108. {
  1109. Options.Lockout.AllowedForNewUsers = await IsTrueAsync(
  1110. VzSettingNames.UserManagement.UserLockOut.IsEnabled,
  1111. tenantId
  1112. );
  1113. Options.Lockout.DefaultLockoutTimeSpan = TimeSpan.FromSeconds(
  1114. await GetSettingValueAsync<int>(
  1115. VzSettingNames.UserManagement.UserLockOut.DefaultAccountLockoutSeconds,
  1116. tenantId
  1117. )
  1118. );
  1119. Options.Lockout.MaxFailedAccessAttempts = await GetSettingValueAsync<int>(
  1120. VzSettingNames.UserManagement.UserLockOut.MaxFailedAccessAttemptsBeforeLockout,
  1121. tenantId
  1122. );
  1123. //Password complexity
  1124. Options.Password.RequireDigit = await GetSettingValueAsync<bool>(
  1125. VzSettingNames.UserManagement.PasswordComplexity.RequireDigit,
  1126. tenantId
  1127. );
  1128. Options.Password.RequireLowercase = await GetSettingValueAsync<bool>(
  1129. VzSettingNames.UserManagement.PasswordComplexity.RequireLowercase,
  1130. tenantId
  1131. );
  1132. Options.Password.RequireNonAlphanumeric = await GetSettingValueAsync<bool>(
  1133. VzSettingNames.UserManagement.PasswordComplexity.RequireNonAlphanumeric,
  1134. tenantId
  1135. );
  1136. Options.Password.RequireUppercase = await GetSettingValueAsync<bool>(
  1137. VzSettingNames.UserManagement.PasswordComplexity.RequireUppercase,
  1138. tenantId
  1139. );
  1140. Options.Password.RequiredLength = await GetSettingValueAsync<int>(
  1141. VzSettingNames.UserManagement.PasswordComplexity.RequiredLength,
  1142. tenantId
  1143. );
  1144. }
  1145. }
  1146. public virtual void InitializeOptions(int? tenantId)
  1147. {
  1148. Options = JsonConvert.DeserializeObject<IdentityOptions>(_optionsAccessor.Value.ToJsonString());
  1149. //Lockout
  1150. if (Options != null)
  1151. {
  1152. Options.Lockout.AllowedForNewUsers = IsTrue(
  1153. VzSettingNames.UserManagement.UserLockOut.IsEnabled,
  1154. tenantId
  1155. );
  1156. Options.Lockout.DefaultLockoutTimeSpan = TimeSpan.FromSeconds(
  1157. GetSettingValue<int>(
  1158. VzSettingNames.UserManagement.UserLockOut.DefaultAccountLockoutSeconds,
  1159. tenantId)
  1160. );
  1161. Options.Lockout.MaxFailedAccessAttempts = GetSettingValue<int>(
  1162. VzSettingNames.UserManagement.UserLockOut.MaxFailedAccessAttemptsBeforeLockout, tenantId);
  1163. //Password complexity
  1164. Options.Password.RequireDigit = GetSettingValue<bool>(
  1165. VzSettingNames.UserManagement.PasswordComplexity.RequireDigit,
  1166. tenantId
  1167. );
  1168. Options.Password.RequireLowercase = GetSettingValue<bool>(
  1169. VzSettingNames.UserManagement.PasswordComplexity.RequireLowercase,
  1170. tenantId
  1171. );
  1172. Options.Password.RequireNonAlphanumeric = GetSettingValue<bool>(
  1173. VzSettingNames.UserManagement.PasswordComplexity.RequireNonAlphanumeric,
  1174. tenantId
  1175. );
  1176. Options.Password.RequireUppercase = GetSettingValue<bool>(
  1177. VzSettingNames.UserManagement.PasswordComplexity.RequireUppercase,
  1178. tenantId
  1179. );
  1180. Options.Password.RequiredLength = GetSettingValue<int>(
  1181. VzSettingNames.UserManagement.PasswordComplexity.RequiredLength,
  1182. tenantId
  1183. );
  1184. }
  1185. }
  1186. protected virtual Task<string> GetOldUserNameAsync(long userId)
  1187. {
  1188. return UserStore.GetUserNameFromDatabaseAsync(userId);
  1189. }
  1190. protected virtual string GetOldUserName(long userId)
  1191. {
  1192. return UserStore.GetUserNameFromDatabase(userId);
  1193. }
  1194. public override async Task<IList<string>> GetValidTwoFactorProvidersAsync(User user)
  1195. {
  1196. var providers = new List<string>();
  1197. foreach (var provider in await base.GetValidTwoFactorProvidersAsync(user))
  1198. {
  1199. var isEmailProviderEnabled = await IsTrueAsync(
  1200. VzSettingNames.UserManagement.TwoFactorLogin.IsEmailProviderEnabled,
  1201. user.TenantId
  1202. );
  1203. if (provider == "Email" && !isEmailProviderEnabled)
  1204. {
  1205. continue;
  1206. }
  1207. var isSmsProviderEnabled = await IsTrueAsync(
  1208. VzSettingNames.UserManagement.TwoFactorLogin.IsSmsProviderEnabled,
  1209. user.TenantId
  1210. );
  1211. if (provider == "Phone" && !isSmsProviderEnabled)
  1212. {
  1213. continue;
  1214. }
  1215. providers.Add(provider);
  1216. }
  1217. return providers;
  1218. }
  1219. private bool IsTrue(string settingName, int? tenantId)
  1220. {
  1221. return GetSettingValue<bool>(settingName, tenantId);
  1222. }
  1223. private Task<bool> IsTrueAsync(string settingName, int? tenantId)
  1224. {
  1225. return GetSettingValueAsync<bool>(settingName, tenantId);
  1226. }
  1227. private T GetSettingValue<T>(string settingName, int? tenantId) where T : struct
  1228. {
  1229. return tenantId == null
  1230. ? _settingManager.GetSettingValueForApplication<T>(settingName)
  1231. : _settingManager.GetSettingValueForTenant<T>(settingName, tenantId.Value);
  1232. }
  1233. private Task<T> GetSettingValueAsync<T>(string settingName, int? tenantId) where T : struct
  1234. {
  1235. return tenantId == null
  1236. ? _settingManager.GetSettingValueForApplicationAsync<T>(settingName)
  1237. : _settingManager.GetSettingValueForTenantAsync<T>(settingName, tenantId.Value);
  1238. }
  1239. protected virtual string L(string name)
  1240. {
  1241. return LocalizationManager.GetString(LocalizationSourceName, name);
  1242. }
  1243. protected virtual string L(string name, CultureInfo cultureInfo)
  1244. {
  1245. return LocalizationManager.GetString(LocalizationSourceName, name, cultureInfo);
  1246. }
  1247. private int? GetCurrentTenantId()
  1248. {
  1249. if (_unitOfWorkManager.Current != null)
  1250. {
  1251. return _unitOfWorkManager.Current.GetTenantId();
  1252. }
  1253. return AbpSession.TenantId;
  1254. }
  1255. private Abp.MultiTenancy.MultiTenancySides GetCurrentMultiTenancySide()
  1256. {
  1257. if (_unitOfWorkManager.Current != null)
  1258. {
  1259. return MultiTenancy.IsEnabled && !_unitOfWorkManager.Current.GetTenantId().HasValue
  1260. ? Abp.MultiTenancy.MultiTenancySides.Host
  1261. : Abp.MultiTenancy.MultiTenancySides.Tenant;
  1262. }
  1263. return AbpSession.MultiTenancySide;
  1264. }
  1265. public virtual async Task AddTokenValidityKeyAsync(
  1266. User user,
  1267. string tokenValidityKey,
  1268. DateTime expireDate,
  1269. CancellationToken cancellationToken = default(CancellationToken))
  1270. {
  1271. await UserStore.AddTokenValidityKeyAsync(user, tokenValidityKey, expireDate, cancellationToken);
  1272. }
  1273. public virtual void AddTokenValidityKey(
  1274. User user,
  1275. string tokenValidityKey,
  1276. DateTime expireDate,
  1277. CancellationToken cancellationToken = default(CancellationToken))
  1278. {
  1279. UserStore.AddTokenValidityKey(user, tokenValidityKey, expireDate, cancellationToken);
  1280. }
  1281. public virtual async Task<bool> IsTokenValidityKeyValidAsync(
  1282. User user,
  1283. string tokenValidityKey,
  1284. CancellationToken cancellationToken = default(CancellationToken))
  1285. {
  1286. return await UserStore.IsTokenValidityKeyValidAsync(user, tokenValidityKey, cancellationToken);
  1287. }
  1288. public virtual bool IsTokenValidityKeyValid(
  1289. User user,
  1290. string tokenValidityKey,
  1291. CancellationToken cancellationToken = default(CancellationToken))
  1292. {
  1293. return UserStore.IsTokenValidityKeyValid(user, tokenValidityKey, cancellationToken);
  1294. }
  1295. public virtual async Task RemoveTokenValidityKeyAsync(
  1296. User user,
  1297. string tokenValidityKey,
  1298. CancellationToken cancellationToken = default(CancellationToken))
  1299. {
  1300. await UserStore.RemoveTokenValidityKeyAsync(user, tokenValidityKey, cancellationToken);
  1301. }
  1302. public virtual void RemoveTokenValidityKey(
  1303. User user,
  1304. string tokenValidityKey,
  1305. CancellationToken cancellationToken = default(CancellationToken))
  1306. {
  1307. UserStore.RemoveTokenValidityKey(user, tokenValidityKey, cancellationToken);
  1308. }
  1309. public bool IsLockedOut(string userId)
  1310. {
  1311. var user = UserStore.FindById(userId);
  1312. if (user == null)
  1313. {
  1314. throw new AbpException("There is no user with id: " + userId);
  1315. }
  1316. var lockoutEndDateUtc = UserStore.GetLockoutEndDate(user);
  1317. return lockoutEndDateUtc > DateTimeOffset.UtcNow;
  1318. }
  1319. public bool IsLockedOut(User user)
  1320. {
  1321. var lockoutEndDateUtc = UserStore.GetLockoutEndDate(user);
  1322. return lockoutEndDateUtc > DateTimeOffset.UtcNow;
  1323. }
  1324. public void ResetAccessFailedCount(User user)
  1325. {
  1326. UserStore.ResetAccessFailedCount(user);
  1327. }
  1328. }