Browse Source

Handle the case when email contains invalid chars.

pull/18612/head
maliming 3 years ago
parent
commit
1d2375d5c0
  1. 66
      modules/identity/src/Volo.Abp.Identity.Domain/Volo/Abp/Identity/IdentityUserManager.cs
  2. 7
      modules/identity/test/Volo.Abp.Identity.Domain.Tests/Volo/Abp/Identity/IdentityUserManager_Tests.cs

66
modules/identity/src/Volo.Abp.Identity.Domain/Volo/Abp/Identity/IdentityUserManager.cs

@ -439,54 +439,58 @@ public class IdentityUserManager : UserManager<IdentityUser>, IDomainService
public virtual async Task<string> GetUserNameFromEmailAsync(string email)
{
const int maxTryCount = 20;
var tryCount = 0;
var userName = email.Split('@')[0];
if (!Options.User.AllowedUserNameCharacters.IsNullOrWhiteSpace() && !userName.All(Options.User.AllowedUserNameCharacters.Contains))
{
// The user name contains not allowed characters. We will use the email address as user name.
return email;
// The username contains not allowed characters. So, we are generating a random username.
do
{
var randomUserName = await GetRandomUserNameAsync(userName.Length);
if ( await ValidateUserNameAsync(randomUserName))
{
return randomUserName;
}
tryCount++;
} while (tryCount < maxTryCount);
}
if (await ValidateUserNameAsync(userName))
else if (await ValidateUserNameAsync(userName))
{
// The username is valid.
return userName;
}
const int maxTryCount = 10;
var tryCount = 0;
if (Options.User.AllowedUserNameCharacters.IsNullOrWhiteSpace() || "0123456789".All(Options.User.AllowedUserNameCharacters.Contains))
else if (Options.User.AllowedUserNameCharacters.IsNullOrWhiteSpace() || "0123456789".All(Options.User.AllowedUserNameCharacters.Contains))
{
var randomUserName = userName;
var isUserNameValid = await ValidateUserNameAsync(randomUserName);
while (tryCount < maxTryCount)
// The AllowedUserNameCharacters includes numbers. So, we are generating 4 random numbers and appending to the username.
tryCount = 0;
do
{
randomUserName = userName + RandomHelper.GetRandom(1000, 9999);
isUserNameValid = await ValidateUserNameAsync(randomUserName);
if (isUserNameValid)
var randomUserName = userName + RandomHelper.GetRandom(1000, 9999);
if ( await ValidateUserNameAsync(randomUserName))
{
return randomUserName;
}
tryCount++;
}
if (isUserNameValid)
{
return randomUserName;
}
} while (tryCount < maxTryCount);
}
tryCount = 0;
while (tryCount < maxTryCount)
else
{
var randomUserName = userName + await GetRandomUserNameAsync(4);
var isUserNameValid = await ValidateUserNameAsync(randomUserName);
if (isUserNameValid)
tryCount = 0;
do
{
return randomUserName;
}
tryCount++;
// The AllowedUserNameCharacters does not include numbers. So, we are generating 4 random characters and appending to the username.
var randomUserName = userName + await GetRandomUserNameAsync(4);
if (await ValidateUserNameAsync(randomUserName))
{
return randomUserName;
}
tryCount++;
} while (tryCount < maxTryCount);
}
// We could not find a valid user name so we are returning the email address.
return email;
throw new AbpException($"Could not get a valid user name for the given email address: {email}, allowed characters: {Options.User.AllowedUserNameCharacters}, tried {maxTryCount} times.");
}
}

7
modules/identity/test/Volo.Abp.Identity.Domain.Tests/Volo/Abp/Identity/IdentityUserManager_Tests.cs

@ -427,7 +427,12 @@ public class IdentityUserManager_Tests : AbpIdentityDomainTestBase
public async Task GetUserNameFromEmailAsync()
{
_identityUserManager.Options.User.AllowedUserNameCharacters = "abcdefghijklmnopqrstuvwxyz0123456789";
var username = await _identityUserManager.GetUserNameFromEmailAsync("admin@abp.io");
var username = await _identityUserManager.GetUserNameFromEmailAsync("Yönetici@abp.io");
username.Length.ShouldBe("Yönetici".Length); //random username
username.All(c => "abcdefghijklmnopqrstuvwxyz0123456789".Contains(c)).ShouldBeTrue();
_identityUserManager.Options.User.AllowedUserNameCharacters = "abcdefghijklmnopqrstuvwxyz0123456789";
username = await _identityUserManager.GetUserNameFromEmailAsync("admin@abp.io");
username.Length.ShouldBe(9); //admin and random 4 numbers
username.ShouldContain("admin");
Regex.IsMatch(username, @"\d{4}$").ShouldBeTrue();

Loading…
Cancel
Save