2010-09-23 4 views
3

J'utilise AspNetSqlMembershipProvider dans mon projet d'application Web ASP .Net 4.ASP .Net: Problème "email unique" AspNetSqlMembershipProvider

J'ai configuré l'adresse de l'utilisateur doit être unique (RequiresUniqueEmail = « true ») dans mon fichier web.config comme ci-dessous:

<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> 

Mais, quand j'exécute le code suivant avec un e-mail déjà dans la base de données , bien que la nouvelle ligne ne soit pas ajoutée à la table aspnet_Membership, une entrée est ajoutée aux tables aspnet_Users et aspnet_Profile.

Est-il possible d'empêcher ces entrées d'être ajoutées aux deux tables décrites ci-dessus?

Voici le code de code sous-jacent:

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

Est-ce que 'Membership.CreateUser (...)' renvoient un booléen indiquant si oui ou non cela a fonctionné? Si oui, vérifiez cela. –

Répondre

5

Il vous suffit de vérifier la valeur de MembershipCreateStatus S; après que vous essayez de créer l'utilisateur et ne pas tomber dans votre code de création de profil.

Voilà pour quoi il est là.

par exemple.

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 
} 

Référence:

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

Je pensais que le bloc try-catch capturerait comme exception les méthodes du fournisseur – Moon

+0

qui ne lancent généralement pas d'exceptions. et dans ce cas, ce n'est pas le cas. c'est ce que le statut d'adhésion est pour –