我的会员提供商遇到一个奇怪的问题,允许将电子邮件设置为空。我已将requiresUniqueEmail设置为true,并且根据Microsoft的文档(https://msdn.microsoft.com/en-us/library/system.web.security.sqlmembershipprovider.createuser%28v=vs.110%29.aspx),
如果RequiresUniqueEmail属性设置为true,并且为email参数指定了null或空字符串(""),则用户创建将失败。
根据这个问题:
Why should underlying membership provider decide whether…?
因此,可能有一个用户没有电子邮件地址。将在数据库中设置空值。但是之后没有其他用户可以省略电子邮件地址,因为这会导致两个用户发送空电子邮件...
但是,我遇到的数量与我发送的空数一样多,是因为用户具有空的电子邮件地址,但它会抓住我尝试创建用户的所有重复电子邮件!怎么了?有任何想法吗?
更新:
当然 - 这是我的web.config:
<add name="MySQLMembershipProvider" autogenerateschema="true" type="MySql.Web.Security.MySQLMembershipProvider, MySql.Web, Version=6.6.5.0, Culture=neutral, PublicKeyToken=c5687fc88969c44d" connectionStringName="mySqlDatabase" enablePasswordRetrieval="false" enablePasswordReset="true" requiresQuestionAndAnswer="false" applicationName="/" requiresUniqueEmail="true" passwordFormat="Hashed" maxInvalidPasswordAttempts="5" minRequiredPasswordLength="7" minRequiredNonalphanumericCharacters="0" passwordAttemptWindow="10" passwordStrengthRegularExpression="" />
我在这里创建了用户(用户可以选择指定用户名或使用他们的电子邮件地址。):
protected int CreateUser(User_FullDTO dtoUser)
{
//-------------------------
// Create Membership user
//-------------------------
MembershipUser newUser;
//If username was not specified, generate username
if (String.IsNullOrWhiteSpace(dtoUser.Username))
{
while (true)
{
//Generate unique string and set as Username
string newUsername = CommonUtility.GenerateUniqueString(10, false);
dtoUser.Username = newUsername;
try
{
//Attempt to create User. On success, exit loop
newUser = Membership.CreateUser(dtoUser.Username, dtoUser.Password, dtoUser.Email);
break;
}
catch (MembershipCreateUserException ex)
{
//If CreateUser failed due to Duplicate User Name, generate new Username
if (ex.StatusCode == MembershipCreateStatus.DuplicateUserName)
continue;
else
throw;
}
}
}
else
{
//Username was specified, create User as normal
newUser = Membership.CreateUser(dtoUser.Username, dtoUser.Password, dtoUser.Email);
}
}
我相信发生的事情是,当他们尝试在Twitter上注册时,他们没有收到回复邮件,因此它会为电子邮件值发送空值。所以我只是好奇为什么它允许保存而不是抛出异常。感谢您的任何见解。作为我现在的解决方法,我只是添加了电子邮件值的检查,并在电子邮件为空时抛出我自己的异常,但我想知道为什么我必须这样做或者如果这是会员提供者的预期结果。