web-dev-qa-db-de.com

ASP.Net-Benutzername an E-Mail senden

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. 

24
teh0wner

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

  • natürlich das Datenbankschema ändern
  • sicherstellung der Eindeutigkeit des Benutzernamens selbst (Sie können eine Datenbankeinschränkung/einen Index für Sie erstellen, aber Sie müssen einen guten Weg finden, um mit Fehlern umzugehen und sie dem Benutzer zu melden.)
  • finden Sie einen guten Ersatz für das Schreiben von "User.Identity.UserName" in Ihren Code
  • wahrscheinlich noch mehr

Wenn Sie sich dagegen entscheiden, das Feld Benutzername zu "hacken", müssen Sie dies tun

  • Ändern Sie die Validierung von RegisterViewModel (fügen Sie [EmailAddress] der UserName-Eigenschaft hinzu), passen Sie [Display (Name = ...)] möglicherweise leicht an usw.
  • 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!

23
rootless

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 falses UserManager auf UserValidator gesetzt ist. Ich bekomme dies jedoch mit der neuesten Web-Vorlage in VS2013.

9
joelmdev

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
6
Hao Kung

Ä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};
    }
}
5
avalla

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

3
Vincent Sels

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;            
}
1
atjoedonahue

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.

0
Rogerio Picilli