Ich arbeite mit dem neuen ASP.NET Identity (RTM) und habe mich gefragt, wie ich die Registrierung und das Anmelden von einem Benutzernamen in eine E-Mail ändern könnte.
Die Idee ist, dass sich meine Benutzer mit ihrer E-Mail-Adresse und einem Kennwort anmelden (E-Mail-Adressen können auch über externe Anmeldung abgerufen werden), und sie richten oben einen Anzeigenamen/Benutzernamen ein.
Ich habe IdentityUser angeschaut und kann sehen, dass Benutzername vorhanden ist, da jedoch diese in ASP.Net Identity verpackt ist, die nicht geändert werden kann.
Ich weiß, ich könnte 'UserName' als E-Mail mit einem benutzerdefinierten Prüfer verwenden und dann ein zusätzliches Attribut für ApplicationUser mit dem Namen DisplayName haben. Dies ist jedoch eher ein Hack als eine Lösung.
Ich hoffe meine Frage ist klar. Danke im Voraus.
Wenn Sie wirklich eine E-Mail-Adresse zum Anmelden verwenden möchten, ist der von Ihnen vorgeschlagene "Hack" der beste Ansatz. Denn wenn Sie darauf bestehen, es richtig zu machen, müssen Sie es zumindest tun
Wenn Sie sich dagegen entscheiden, das Feld Benutzername zu "hacken", müssen Sie dies tun
stellen Sie sicher, dass die in Ihrem AccountController verwendete UserManager.UserValidator-Instanz Sonderzeichen für E-Mail-Adressen zulässt. Stellen Sie dazu sicher, dass der nicht standardmäßige Konstruktor folgendermaßen aussieht:
public AccountController(UserManager<ApplicationUser> userManager)
{
UserManager = userManager;
var userValidator = UserManager.UserValidator as UserValidator<ApplicationUser>;
userValidator.AllowOnlyAlphanumericUserNames = false;
}
Ich hoffe, dies könnte Ihnen dabei helfen, die Vor- und Nachteile beider Ansätze abzuwägen und die beste Lösung zu finden. Viel Glück!
Etwas spät zur Party, aber ich dachte, ich würde meine $ 0,02 einwerfen.
Es ist zwar wahr, dass UserName
und Email
beide Teil von IdentityUser
sind und daher erforderlich sind. Beachten Sie jedoch, dass beide als virtual
markiert sind. Wenn Sie möchten, dass UserName
und Email
die E-Mail-Adresse ist, lassen Sie das ApplicationUser-Modell die Logik so einkapseln:
public class ApplicationUser : IdentityUser
{
private string _userNameEmailBackingField;
public override string UserName
{
get { return _userNameEmailBackingField; }
set { _userNameEmailBackingField = value; }
}
public override string Email
{
get { return _userNameEmailBackingField; }
set { _userNameEmailBackingField = value; }
}
//The rest of your ApplicationUser logic
}
Machen Sie dann in Ihrem Ansichtsmodell nur eine einzige Eigenschaft verfügbar und ordnen Sie sie entweder/oder in Ihrer ApplicationUser
-Instanz zu. Stellen Sie dabei sicher, dass Sie die Ansichtsmodelleigenschaft mit den Attributen [Required]
und [EmailAddress]
dekorieren.
Wie andere bereits erwähnt haben, müssen Sie sicherstellen, dass AllowOnlyAlphanumericUserNames
für false
s UserManager
auf UserValidator
gesetzt ist. Ich bekomme dies jedoch mit der neuesten Web-Vorlage in VS2013.
Ich arbeite gerade an dieser Funktion für die Identity 1.1-Vorlagen, die zu E-Mail wechseln und Kontofestlegungs-/Passwort vergessen-Funktionalität hinzufügen wird. Die beiden Optionen, die wir in Betracht gezogen haben, waren der Hack (verwenden Sie den Benutzernamen als E-Mail mit Validierung) und das Hinzufügen eines zusätzlichen E-Mail-Felds das ist getrennt von dem Benutzernamen, zu dem wir uns neigen.
Es ist wahrscheinlich, dass in Version 1.1 einige spezifische E-Mail-Adressen zum UserManager hinzugefügt werden:
FindByEmail
SetEmail
GetEmail
Ändern Sie die UserValidator-Eigenschaft für Ihr UserManager-Objekt:
public class UserManager : UserManager<User>
{
public IUserStore<User> Users { get; private set; }
public UserManager(IUserStore<User> store) : base(store)
{
Users = store;
UserValidator = new UserValidator<User>(this) {AllowOnlyAlphanumericUserNames = false};
}
}
Wie Sie wahrscheinlich herausgefunden haben (und zu erwarten waren), fügt ASP.NET Identity 2.0.0, veröffentlicht im März 2014, diese Funktionalität in das Framework ein.
Ankündigung: http://blogs.msdn.com/b/webdev/archive/2014/03/20/test-announcing-rtm-of-asp-net-identity-2-0-0.aspx
Vollständiges Beispiel und Tutorial, einschließlich Kontobestätigung: http://www.asp.net/identity/overview/features-api/account-confirmation-and-password-recovery-with-aspnet-identity
Während ich an einem ähnlichen Problem arbeitete, fand ich die einfachste Lösung, die eingegebenen Benutzernamen einfach als "E-Mail" zu kennzeichnen und dann die Mitgliedschafts-E-Mail während onCreating manuell festzulegen.
protected void RegisterUser_CreatingUser(object sender, LoginCancelEventArgs e){
RegisterUser.Email = RegisterUser.UserName;
}
Ich bekomme das zum Laufen.
Gehen Sie zuerst zu accountViewModels und fügen Sie eine Eigenschaft für den Benutzernamen hinzu
Public Class RegisterViewModel
<Required>
<Display(Name:="User Name")>
Public Property UserName As String
<Required>
<EmailAddress>
<Display(Name:="Email")>
Public Property Email As String
Nachdem Sie Ihre Registeransicht geändert haben, fügen Sie die Benutzername-Eigenschaft hinzu
<div class="form-group">
@Html.LabelFor(Function(m) m.UserName, New With {.class = "col-md-2 control-label"})
<div class="col-md-10">
@Html.TextBoxFor(Function(m) m.UserName, New With {.class = "form-control"})
</div>
</div>
<div class="form-group">
@Html.LabelFor(Function(m) m.Email, New With {.class = "col-md-2 control-label"})
<div class="col-md-10">
@Html.TextBoxFor(Function(m) m.Email, New With {.class = "form-control"})
</div>
</div>
Sobald dies geschehen ist, ändern Sie auch Ihre Login-Ansicht
@Html.ValidationSummary(True, "", New With {.class = "text-danger"})
<div class="form-group">
@Html.Label("User Name", New With {.class = "col-md-2 control-label"})
<div class="col-md-10">
@Html.TextBoxFor(Function(m) m.Email, New With {.class = "form-control"})
@Html.ValidationMessageFor(Function(m) m.Email, "", New With {.class = "text-danger"})
</div>
</div>
<div class="form-group">
@Html.LabelFor(Function(m) m.Password, New With {.class = "col-md-2 control-label"})
<div class="col-md-10">
@Html.PasswordFor(Function(m) m.Password, New With {.class = "form-control"})
@Html.ValidationMessageFor(Function(m) m.Password, "", New With {.class = "text-danger"})
</div>
</div>
Das ist alles was du brauchst. Auf diese Weise können Sie sich mit dem Benutzernamen und nicht mit der E-Mail-Adresse anmelden.