我在很多应用程序中使用了 Asp.net 身份管理器,它们都工作得很好。
我检查了其他代码库,除了启动类中的密码覆盖之外,逻辑是相同的。我不明白为什么没有添加NormalizedEmail。
启动.cs
.AddEntityFrameworkStores<CorporateIdentityContext>()
.AddDefaultTokenProviders();
//override identity Password rule
services.Configure<IdentityOptions>(opts => {
opts.Password.RequiredLength = 6;
opts.Password.RequireNonAlphanumeric = false;
opts.Password.RequireLowercase = false;
//opts.Password.RequireUppercase = true;
opts.Password.RequireDigit = false;
opts.User.RequireUniqueEmail = true;
//opts.SignIn.RequireConfirmedEmail = false;
opts.User.AllowedUserNameCharacters = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789-._@+";
//options.User.AllowedUserNameCharacters = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789-._@+/";
//opts.User.AllowedUserNameCharacters = null;
});
创建用户方法
public async Task<ServiceResponse<GetUserDto>> RegisterUser(UserDto payload)
{
var serviceResponse = new ServiceResponse<GetUserDto>();
//Check if user already or register here
//var CorporateUser = await _userManager.Users.FirstOrDefaultAsync(x => x.Email == payload.Email);
//This is the standard
var CorporateUser = await _userManager.FindByNameAsync(payload.Email);
if (CorporateUser != null)
{
_logger.LogInformation($"User already exist for this email: {CorporateUser.Email}");
serviceResponse.Message = $"User already exist for this email: {CorporateUser.Email}";
serviceResponse.Success = false;
return serviceResponse;
}
var password = Helper.ServiceHelper.GeneratePassword(7);
var uniqueId = ServiceHelper.GeneratePolNumber();
var refnum = ServiceHelper.GeneratePropNumber();
var newUser = new CorporateIdentityUser
{
Email = payload.Email,
UserName = payload.UserName,
UserUniqueId = uniqueId,
NormalizedEmail = payload.Email.ToUpper(),
//NormalizedUserName = payload.Email,
RefrenceId = refnum,
FirstName = payload.FirstName,
LastName = payload.LastName,
CompanyName = payload.CompanyName,
BrokerName = payload.BrokerName,
AccountType = "Generaluser",
Country = payload.Country,
RcNumber = payload.RcNumber,
DateCreated = DateTime.Now,
Address = payload.Address,
Occupation = payload.Occupation,
Gender =payload.Gender,
DateofBirth = payload.DateofBirth,
IsActive = false,
IsWallet = false,
IsBroker = false,
PhoneNumber = payload.PhoneNumber,
SecurityStamp = Guid.NewGuid().ToString()
};
try
{
var result = await _userManager.CreateAsync(newUser, password);
if (!result.Succeeded)
{
var errorMsg = string.Empty;
foreach (var error in result.Errors)
{
_logger.LogError($"The error occur while registring {newUser.Email}: {error.Code}, {error.Description}");
errorMsg = error.Description;
}
serviceResponse.Message = errorMsg;
serviceResponse.Success = false;
}
else
{
var confirmEmailToken = await _userManager.GenerateEmailConfirmationTokenAsync(newUser);
var encodedEmailToken = Encoding.UTF8.GetBytes(confirmEmailToken);
var validEmailtoken = WebEncoders.Base64UrlEncode(encodedEmailToken);
var body = new Dictionary<string, object>()
{
{ "name", payload.FirstName.ToUpper() +" "+ payload.LastName},
{ "password", password},
{"email", payload.Email },
{"temp_id", 27059391}
};
await Helper.ServiceHelper.SendEmailVerificationViaPostmarkAsync(body);
serviceResponse.Data = _mapper.Map<GetUserDto>(newUser);
serviceResponse.Message = "Registration Successful";
serviceResponse.Success = true;
_logger.LogInformation($"Registration successfull for this username: {newUser.Email}");
}
}
catch (Exception ex)
{
string error = ex.Message;
serviceResponse.Message= error;
_logger.LogError($"Error occured! Message {ex.Message} Stack Trace {ex.StackTrace}");
//throw;
}
return serviceResponse;
}
我知道这是一个古老的问题,但我面临着同样的问题,即使
NormalizedEmail
字段已正确填充,null
字段始终被保存为Email
。
我的问题是,从
IdentityUser
继承的自定义用户类拥有自己的 Email
属性。删除它并依赖继承的 Email
属性解决了我的问题。