From 4d798c24f2a02e2ac26d5ffe303301e7170b8615 Mon Sep 17 00:00:00 2001 From: maliming Date: Wed, 27 Dec 2023 21:25:21 +0800 Subject: [PATCH] Add `ValidateUserNameAsync` & `GetRandomUserNameAsync` to `IdentityUserManager`. --- .../Volo/Abp/Identity/IdentityUserManager.cs | 41 ++++++++++++++++- .../Abp/Identity/IdentityUserManager_Tests.cs | 44 +++++++++++++++++++ 2 files changed, 84 insertions(+), 1 deletion(-) diff --git a/modules/identity/src/Volo.Abp.Identity.Domain/Volo/Abp/Identity/IdentityUserManager.cs b/modules/identity/src/Volo.Abp.Identity.Domain/Volo/Abp/Identity/IdentityUserManager.cs index f8bfe5b603..fce656cc09 100644 --- a/modules/identity/src/Volo.Abp.Identity.Domain/Volo/Abp/Identity/IdentityUserManager.cs +++ b/modules/identity/src/Volo.Abp.Identity.Domain/Volo/Abp/Identity/IdentityUserManager.cs @@ -82,7 +82,7 @@ public class IdentityUserManager : UserManager, IDomainService return await CreateAsync(user); } - + public async override Task DeleteAsync(IdentityUser user) { user.Claims.Clear(); @@ -397,4 +397,43 @@ public class IdentityUserManager : UserManager, IDomainService await UserRepository.UpdateOrganizationAsync(sourceOrganizationId, targetOrganizationId, CancellationToken); } + + public virtual async Task ValidateUserNameAsync(string userName, Guid? userId = null) + { + if (string.IsNullOrWhiteSpace(userName)) + { + return false; + } + + if (!string.IsNullOrEmpty(Options.User.AllowedUserNameCharacters) && userName.Any(c => !Options.User.AllowedUserNameCharacters.Contains(c))) + { + return false; + } + + var owner = await FindByNameAsync(userName); + if (owner != null && owner.Id != userId) + { + return false; + } + + return true; + } + + public virtual Task GetRandomUserNameAsync(int length) + { + var allowedUserNameCharacters = Options.User.AllowedUserNameCharacters; + if (allowedUserNameCharacters.IsNullOrWhiteSpace()) + { + allowedUserNameCharacters = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789-._@+"; + } + + var randomUserName = string.Empty; + var random = new Random(); + while (randomUserName.Length < length) + { + randomUserName += allowedUserNameCharacters[random.Next(0, allowedUserNameCharacters.Length)]; + } + + return Task.FromResult(randomUserName); + } } diff --git a/modules/identity/test/Volo.Abp.Identity.Domain.Tests/Volo/Abp/Identity/IdentityUserManager_Tests.cs b/modules/identity/test/Volo.Abp.Identity.Domain.Tests/Volo/Abp/Identity/IdentityUserManager_Tests.cs index ec29d3d29a..f5b648516e 100644 --- a/modules/identity/test/Volo.Abp.Identity.Domain.Tests/Volo/Abp/Identity/IdentityUserManager_Tests.cs +++ b/modules/identity/test/Volo.Abp.Identity.Domain.Tests/Volo/Abp/Identity/IdentityUserManager_Tests.cs @@ -2,6 +2,7 @@ using System.Collections.Generic; using System.Linq; using System.Security.Claims; +using System.Text.RegularExpressions; using System.Threading.Tasks; using Microsoft.AspNetCore.Identity; using Microsoft.Extensions.DependencyInjection; @@ -378,6 +379,49 @@ public class IdentityUserManager_Tests : AbpIdentityDomainTestBase } } + [Fact] + public async Task ValidateUserNameAsync() + { + var result = await _identityUserManager.ValidateUserNameAsync("M_y+User-001@abp.io"); + result.ShouldBeTrue(); + + var user = CreateRandomUser(); + (await _identityUserManager.CreateAsync(user)).CheckErrors(); + + result = await _identityUserManager.ValidateUserNameAsync(user.UserName, user.Id); + result.ShouldBeTrue(); + + result = await _identityUserManager.ValidateUserNameAsync(user.UserName); + result.ShouldBeFalse(); + + result = await _identityUserManager.ValidateUserNameAsync("无效的字符"); + result.ShouldBeFalse(); + } + + [Fact] + public async Task GetRandomUserNameAsync() + { + _identityUserManager.Options.User.AllowedUserNameCharacters = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789-._@+"; + var username = await _identityUserManager.GetRandomUserNameAsync(15); + username.Length.ShouldBe(15); + username.All(c => _identityUserManager.Options.User.AllowedUserNameCharacters.Contains(c)).ShouldBeTrue(); + + _identityUserManager.Options.User.AllowedUserNameCharacters = "abcdefghijklmnopqrstuvwxyz0123456789"; + username = await _identityUserManager.GetRandomUserNameAsync(15); + username.Length.ShouldBe(15); + username.All(c => _identityUserManager.Options.User.AllowedUserNameCharacters.Contains(c)).ShouldBeTrue(); + + _identityUserManager.Options.User.AllowedUserNameCharacters = "0123456789"; + username = await _identityUserManager.GetRandomUserNameAsync(15); + username.Length.ShouldBe(15); + username.All(c => _identityUserManager.Options.User.AllowedUserNameCharacters.Contains(c)).ShouldBeTrue(); + + _identityUserManager.Options.User.AllowedUserNameCharacters = null!; + username = await _identityUserManager.GetRandomUserNameAsync(15); + username.Length.ShouldBe(15); + username.All(c => "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789-._@+".Contains(c)).ShouldBeTrue(); + } + private async Task CreateRandomDefaultRoleAsync() { await _identityRoleRepository.InsertAsync(