2010-09-23 1 views
3

Я использую AspNetSqlMembershipProvider в своем проекте ASP .NET .NET для веб-приложений.ASP .Net: проблема AspNetSqlMembershipProvider «уникальная электронная почта»

Я настроил адрес пользователя должен быть уникальным (RequiresUniqueEmail = «истина») в моем файле web.config, как показано ниже:

<membership> 
    <providers> 
     <clear /> 
     <add name="AspNetSqlMembershipProvider" 
      type="System.Web.Security.SqlMembershipProvider, System.Web, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" 
      connectionStringName="MyAuthDB" 
      enablePasswordRetrieval="false" 
      enablePasswordReset="true" 
      requiresQuestionAndAnswer="true" 
      applicationName="/" 
      requiresUniqueEmail="true" 
      minRequiredPasswordLength="6" 
      minRequiredNonalphanumericCharacters="1" 
      passwordFormat="Hashed" 
      maxInvalidPasswordAttempts="5" 
      passwordAttemptWindow="10" /> 
    </providers> 
</membership> 

Но, когда я выполнить следующий код по электронной почте уже в базе данных , хотя новая строка не добавляется в таблицу aspnet_Membership, запись добавляется в таблицы aspnet_Users и aspnet_Profile.

Есть ли способ, которым я могу остановить эти записи от добавления к двум таблицам, описанным выше?

Вот код из кода позади:

if (Membership.GetUser(EN(this.Id.Value)) != null) { 
    this.CustomFieldValidatorId.IsValid = false; 
} 
else { 
    try { 
     string username = EN(this.Id.Value); 
     string password = EN(this.Password.Value); 
     string email = EN(this.Email.Value); 
     string question = EN(this.SecurityQuestion.Value); 
     string answer = EN(this.Answer.Value); 

     string firstname = EN(this.FirstName.Value); 
     string lastname = EN(this.LastName.Value); 
     DateTime birthdate = new DateTime(
      Convert.ToInt32(EN(this.BirthYear.SelectedValue)), 
      Convert.ToInt32(EN(this.BirthMonth.SelectedValue)), 
      Convert.ToInt32(EN(this.BirthDay.SelectedValue))); 
     string company = EN(this.Company.Value); 
     string add1 = EN(this.StreetAddress1.Value); 
     string add2 = EN(this.StreetAddress2.Value); 
     string city = EN(this.City.Value); 
     string state = EN(this.State.Value); 
     string zip = EN(this.Zip.Value); 
     string country = EN(this.Country.SelectedValue); 
     string countrycode = EN(this.CountryCode.Value); 
     string areacode = EN(this.AreaCode.Value); 
     string phonenum = EN(this.PhoneNumber.Value); 
     string extension = EN(this.Extension.Value); 

     MembershipCreateStatus S; 
     Membership.CreateUser(username, password, email, question, answer, false, out S); 

     WebProfile wp = new WebProfile(); 
     wp.Initialize(username, true); 

     wp.PersonalInformation.FirstName = firstname; 
     wp.PersonalInformation.LastName = lastname; 
     wp.PersonalInformation.BirthDate = birthdate; 
     wp.PersonalInformation.Company = company; 
     wp.PersonalInformation.StreetAddress1 = add1; 
     wp.PersonalInformation.StreetAddress2 = add2; 
     wp.PersonalInformation.City = city; 
     wp.PersonalInformation.State = state; 
     wp.PersonalInformation.Zip = zip; 
     wp.PersonalInformation.Country = country; 
     wp.PersonalInformation.PhoneCountryCode = countrycode; 
     wp.PersonalInformation.PhoneAreaCode = areacode; 
     wp.PersonalInformation.PhoneNumber = phonenum; 
     wp.PersonalInformation.PhoneExtension = extension; 

     wp.Save(); 

     MembershipUser user = Membership.GetUser(username); 
     Roles.AddUserToRole(username, "Developer"); 
     Membership.UpdateUser(user); 

     EmailDeveloper(firstname, lastname, email, (Guid)user.ProviderUserKey); 

     this.DeveloperEmail.Text = email; 
    } 
    catch (MembershipCreateUserException ex) { 
     switch (ex.StatusCode) { 
      case MembershipCreateStatus.DuplicateEmail: 
       this.CustomFieldValidatorEmail.IsValid = false; 
       break; 
      default: 
       this.CustomFieldValidatorGeneral.ErrorMessage = ex.Message.ToString(); 
       this.CustomFieldValidatorGeneral.IsValid = false; 
       break; 
     } 
    } 
} 

private string EN(string v) { 
    return HttpUtility.HtmlEncode(v.Trim()); 
} 
+0

ли 'Membership.CreateUser (...)' возвращает логическое значение, указывающее, является ли или не работал ли? Если да, проверьте это. –

ответ

5

Вам просто нужно проверить значение MembershipCreateStatus S; после попытки создать пользователя и не провалиться в код создания профиля.

Это то, для чего оно предназначено.

например.

MembershipCreateStatus S; 
Membership.CreateUser(username, password, email, question, answer, false, out S); 

if(S != MembershipCreateStatus.Success) 
{ 
    // throw exception or display message and exit here 
    // DO NOT PASS GO, DO NOT COLLECT $2000 (adjusted for inflation) 
    // and in NO circumstances fall through to the code below that creates 
    // the profile and aspnet_users placeholder record that you mention 
} 

Ссылка:

public enum MembershipCreateStatus 
{ 
    Success, 
    InvalidUserName, 
    InvalidPassword, 
    InvalidQuestion, 
    InvalidAnswer, 
    InvalidEmail, 
    DuplicateUserName, 
    DuplicateEmail, 
    UserRejected, 
    InvalidProviderUserKey, 
    DuplicateProviderUserKey, 
    ProviderError 
} 
+0

Я думал, что блок try-catch поймает это как исключение – Moon

+0

методы провайдера обычно не генерируют исключения. и в этом случае это не так. вот что означает статус членства для –

 Смежные вопросы

  • Нет связанных вопросов^_^