2014-11-04 3 views
13

Sto usando ASP.NET MVC identità e quando aggiungo una e-mail della forma [email protected] ottengo il messaggio di errore di convalidaemail Identità con il precipitare in Asp.Net Identità

nome utente [email protected] non è valido, può contenere solo lettere o cifre.

Come posso modificare la convalida in modo che consenta l'accettazione dell'e-mail?

mio cshtml è:

@using (Html.BeginForm("Login", "Account", new { ReturnUrl = ViewBag.ReturnUrl }, FormMethod.Post, new { role = "form" })) 
     { 
      @Html.AntiForgeryToken() 

      <div class="reg-header"> 
       <h2>Register</h2> 
      </div> 
      <fieldset> 
       @if (ViewBag.IsRegister) 
       { 
        @Html.ValidationSummary(true, "", new { @class = "text-danger" }) 
       } 
       <div class="margin-bottom-20"> 
        @Html.LabelFor(m => m.RegisterViewModel.FirstName)<br /> 
        <div class="input-group"> 
         <span class="input-group-addon"><i class="fa fa-user"></i></span> 
         @Html.TextBoxFor(m => m.RegisterViewModel.FirstName, new { @class = "form-control" }) 
        </div> 
        @Html.ValidationMessageFor(m => m.RegisterViewModel.FirstName, "", new { @class = "text-danger" }) 
       </div> 

       <div class="margin-bottom-20"> 
        @Html.LabelFor(m => m.RegisterViewModel.LastName)<br /> 
        <div class="input-group"> 
         <span class="input-group-addon"><i class="fa fa-user"></i></span> 
         @Html.TextBoxFor(m => m.RegisterViewModel.LastName, new { @class = "form-control" }) 
        </div> 
        @Html.ValidationMessageFor(m => m.RegisterViewModel.LastName, "", new { @class = "text-danger" }) 
       </div> 

       <div class="margin-bottom-20"> 
        @Html.LabelFor(m => m.RegisterViewModel.Email)<br /> 
        <div class="input-group"> 
         <span class="input-group-addon"><i class="fa fa-user"></i></span> 
         @Html.TextBoxFor(m => m.RegisterViewModel.Email, new { @class = "form-control" }) 
        </div> 
        @Html.ValidationMessageFor(m => m.RegisterViewModel.Email, "", new { @class = "text-danger" }) 
       </div> 

       <div class="margin-bottom-20"> 
        @Html.LabelFor(m => m.RegisterViewModel.Password)<br /> 
        <div class="input-group "> 
         <span class="input-group-addon"><i class="fa fa-lock"></i></span> 
         @Html.PasswordFor(m => m.RegisterViewModel.Password, new { @class = "form-control" }) 

        </div> 
        @Html.ValidationMessageFor(m => m.RegisterViewModel.Password, "", new { @class = "text-danger" }) 
       </div> 

       <div class="margin-bottom-20"> 
        @Html.LabelFor(m => m.RegisterViewModel.ConfirmPassword)<br /> 
        <div class="input-group"> 
         <span class="input-group-addon"><i class="fa fa-lock"></i></span> 
         @Html.PasswordFor(m => m.RegisterViewModel.ConfirmPassword, new { @class = "form-control" }) 
         <div class="clear"></div> 
        </div> 
        @Html.ValidationMessageFor(m => m.RegisterViewModel.ConfirmPassword, "", new { @class = "text-danger" }) 
       </div> 
       <div class="row"> 

        <div class="col-md-12"> 
         <button class="btn-u" type="submit" name="command" value="Register">Register</button> 
        </div> 
       </div> 
      </fieldset> 
     } 

Questo è il mio controllo:

   RegisterViewModel model = login.RegisterViewModel; 
       var user = new ApplicationUser() { UserName = model.Email, FirstName = model.FirstName, LastName = model.LastName, UserRole = UserRole.Rider }; 
       IdentityResult result = await UserManager.CreateAsync(user, model.Password); 
       if (result.Succeeded) 
       { 
        await SignInAsync(user, isPersistent: false); 

        // For more information on how to enable account confirmation and password reset please visit http://go.microsoft.com/fwlink/?LinkID=320771 
        // Send an email with this link 
        // string code = await UserManager.GenerateEmailConfirmationTokenAsync(user.Id); 
        // var callbackUrl = Url.Action("ConfirmEmail", "Account", new { userId = user.Id, code = code }, protocol: Request.Url.Scheme); 
        // await UserManager.SendEmailAsync(user.Id, "Confirm your account", "Please confirm your account by clicking <a href=\"" + callbackUrl + "\">here</a>"); 

        return RedirectToLocal(returnUrl); 
        //return RedirectToAction("Index", "Home"); 
       } 
       else 
       { 
        ViewBag.ReturnUrl = returnUrl; 
        AddErrors(result); 
       } 
+0

Ho avuto lo stesso problema. Avevo 'AllowOnlyAlphanumericUserNames = false' in' IdentityConfig.cs', ma ha comunque generato l'errore. Quando ho inserito il codice nel controller, ha funzionato. Non lo capisco Ma grazie per aver postato la tua soluzione, mi hai salvato temporaneamente un mal di testa :) –

+0

Ho inserito la risposta come una risposta reale. Se preferisci farlo da solo fammelo sapere e cancellerò la risposta wiki – Liam

risposta

14

L'impostazione predefinita UserValidator che viene utilizzato nella UserManager ha una proprietà AllowOnlyAlphanumericUserNames che è impostata su true .. dovrai per sovrascriverlo per consentire i caratteri speciali. Una possibile soluzione sarebbe quella di sovrascrivere l'UserManager con la propria implementazione in questo modo.

public class ApplicationUserManager : UserManager<ApplicationUser> 
{ 
    public ApplicationUserManager(IUserStore<ApplicationUser> store) : base(store) 
    { 
     this.UserValidator = new UserValidator<ApplicationUser>(this) { AllowOnlyAlphanumericUserNames = false }; 
    } 
} 

public class ApplicationUser : IdentityUser 
{ 
    //Custom Properties etc. 
} 
+0

Ho provato questo sia sul mio progetto che su un progetto vuoto e non ha fatto nessuna differenza su nessuno dei due. – Y8sy

+1

Puoi mostrare la configurazione del tuo ** UserManager **? La soluzione suggerita risolve normalmente questo tipo di problema. Ad un certo punto devi impostare questa proprietà su * false *. –

+0

Hey ragazzi, mi avete messo sulla strada giusta, invece di inserire il codice nel modello di identità l'ho inserito nel controller account. Grazie per avermi indicato nella giusta direzione. – Y8sy

5

Grazie per l'assistenza in merito.

realtà ho risolto questa situazione inserendo la seguente nel conto regolatore

public AccountController(UserManager<ApplicationUser> userManager) 
    { 
     var provider = new Microsoft.Owin.Security.DataProtection.DpapiDataProtectionProvider("One"); 
     userManager.UserTokenProvider = new Microsoft.AspNet.Identity.Owin.DataProtectorTokenProvider<ApplicationUser>(provider.Create("EmailConfirmation")); 
     UserManager = userManager; 

     UserManager.UserValidator = new UserValidator<ApplicationUser>(UserManager) 
     { 
      AllowOnlyAlphanumericUserNames = false 
     }; 
    } 
+0

che potrei darti più voti –