web-dev-qa-db-fra.com

ASP.Net UserName à Email

Je travaille avec la nouvelle identité ASP.NET (RTM) et je me demandais comment je pourrais continuer à changer l'enregistrement et la connexion d'un nom d'utilisateur à un courrier électronique.

L'idée est que je veux que mes utilisateurs s'inscrivent en utilisant leur adresse e-mail et un mot de passe (les e-mails peuvent également être acquis en utilisant une connexion externe) et ils configurent un nom d'affichage/nom d'utilisateur en haut.

J'ai examiné IdentityUser et je peux voir que UserName est présent, mais comme il est compressé dans ASP.Net Identity, il ne peut pas être modifié.

Je sais que je pourrais utiliser «UserName» comme courrier électronique, avec un validateur personnalisé, puis avoir un attribut supplémentaire pour ApplicationUser appelé DisplayName, mais il s’agit plus d’un hack que d’une solution.

J'espère que ma question est claire. Merci d'avance. 

24
teh0wner

Si vous voulez vraiment utiliser une adresse e-mail pour vous connecter, alors, à mon humble avis, le "piratage" que vous avez suggéré est la meilleure approche. Parce que, si vous insistez pour "le faire correctement", vous devrez au moins

  • modifier le schéma de base de données, évidemment
  • assurez-vous que votre nom d'utilisateur est unique (vous pouvez faire en sorte que la contrainte/l'index de la base de données le fasse à votre place, mais vous devrez trouver un bon moyen de traiter les erreurs et de les signaler à l'utilisateur)
  • trouvez un bon substitut pour écrire simplement "User.Identity.UserName" dans votre code
  • probablement même plus

D'autre part, si vous décidez de "pirater" le champ Nom d'utilisateur, vous devez

  • modifier la validation RegisterViewModel (ajouter [EmailAddress] à la propriété UserName), probablement légèrement personnaliser [Display (Name = ...)], etc.
  • assurez-vous que l'instance UserManager.UserValidator utilisée dans votre AccountController autorise les caractères spéciaux utilisés dans les adresses électroniques. Pour ce faire, assurez-vous que son constructeur, autre que celui par défaut, ressemble à ceci:

    public AccountController(UserManager<ApplicationUser> userManager)
    {
        UserManager = userManager;
        var userValidator = UserManager.UserValidator as UserValidator<ApplicationUser>;
        userValidator.AllowOnlyAlphanumericUserNames = false;
    }
    

J'espère que cela pourrait vous aider à peser le pour et le contre des deux approches et à proposer la meilleure solution. Bonne chance!

23
rootless

Peu en retard à la fête, mais je pensais jeter mon 0,02 $.

S'il est vrai que UserName et Email font tous les deux partie de IdentityUser et sont donc obligatoires, notez qu'ils sont tous deux marqués comme étant virtual. Si vous souhaitez que UserName et Email soient l'adresse électronique, laissez le modèle ApplicationUser encapsuler la logique de la manière suivante:

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
}

Ensuite, dans votre modèle de vue, n'exposez qu'une seule propriété et mappez-la sur/ou dans votre instance ApplicationUser, en veillant à décorer la propriété de modèle de vue avec les attributs [Required] et [EmailAddress].

Comme d'autres l'ont déjà mentionné, vous devrez vous assurer que AllowOnlyAlphanumericUserNames est défini sur false pour UserManager 's UserValidator, mais je vous en prie avec le dernier modèle Web de VS2013.

9
joelmdev

Je travaille actuellement sur cette fonctionnalité pour les modèles Identity 1.1 qui passeront à la messagerie électronique et ajouteront une fonctionnalité de confirmation de compte/mot de passe oublié. Les deux options que nous avons considérées étaient le hack (utiliser le nom d'utilisateur comme email avec validation) et l'ajout d'un champ de messagerie supplémentaire. qui est séparé du nom d'utilisateur, vers lequel nous nous penchons.

Il est probable que quelques API spécifiques au courrier électronique soient ajoutés dans la version 1.1 à UserManager:

FindByEmail
SetEmail
GetEmail
6
Hao Kung

Modifiez la propriété UserValidator pour votre objet UserManager:

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

Comme vous l'aurez probablement déjà constaté (et il fallait s'y attendre), ASP.NET Identity 2.0.0, publié en mars 2014, ajoute cette fonctionnalité au cadre.

Annonce: http://blogs.msdn.com/b/webdev/archive/2014/03/20/test-announcing-rtm-of-asp-net-identity-2-0-0.aspx

Exemple complet et tutoriel, y compris la confirmation du compte: http://www.asp.net/identity/overview/features-api/account-confirmation-and-password-recovery- with-aspnet-identity

3
Vincent Sels

Alors que je travaillais sur un problème similaire, j’ai trouvé que la solution la plus simple consistait simplement à étiqueter l’entrée Nom d’utilisateur sous le nom «Email», puis à définir manuellement l’e-mail d’adhésion au cours de la création.

protected void RegisterUser_CreatingUser(object sender, LoginCancelEventArgs e){
    RegisterUser.Email = RegisterUser.UserName;            
}
1
atjoedonahue

Je travaille ça.

Allez d'abord à accountViewModels et ajoutez une propriété pour le nom d'utilisateur

Public Class RegisterViewModel
    <Required>
    <Display(Name:="User Name")>
    Public Property UserName As String

    <Required>
    <EmailAddress>
    <Display(Name:="Email")>
    Public Property Email As String

Après avoir modifié votre vue Register en ajoutant la propriété username

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

Une fois cela fait, modifiez également votre vue de connexion

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

C'est tout ce dont vous avez besoin. De cette façon, vous pouvez vous connecter avec le nom d'utilisateur et non avec l'adresse électronique.

0
Rogerio Picilli