2009-09-21 5 views
3

En utilisant l'authentification par formulaires ASP.NET, comment accepteriez-vous une adresse e-mail et un mot de passe, utiliser l'adresse e-mail pour rechercher le nom d'utilisateur, puis connectez-vous avec le nom d'utilisateur et le mot de passe recherchés?ASP.NET Contrôle de connexion, se connecter avec e-mail mais e-mail n'est pas le nom d'utilisateur (comment faire)?

Nous avons ce système de cartes qui a des numéros d'employés, mais personne ne peut se souvenir de leurs numéros. L'évidence serait d'utiliser les adresses e-mail pour la connexion, mais le reste de l'application dépend du nom d'utilisateur étant le numéro d'employé.

Merci. Les liens/exemples de code seraient géniaux.

Notre solution actuelle C# se termine par une exception de référence null sur:

Response.Write(Membership.GetUser().UserName);

encore ces deux fonctionnent très bien:

string userName = Membership.GetUserNameByEmail(emailAddress);
bool successfulLogin = Membership.ValidateUser(userName, password);

+0

Et si vous essayez: Response.Write (Membership.GetuserNameByEmail (emailAddress) .UserName)? –

Répondre

3

Ne pas utiliser le journal en contrôle. Il suffit d'y mettre vos propres zones de texte et d'exécuter votre propre logique d'authentification. Si l'utilisateur réussit, appelez le FormsAuthentication.RedirectFromLoginPage. Cela les connectera sans les obliger à entrer leur nom d'utilisateur, tant que vous pouvez le regarder à partir de leur adresse e-mail.

Voir docs.

+0

Je dois dire que cela fonctionne. C'est un excellent travail. Je ne suis pas sûr pourquoi le contrôle de connexion par défaut échoue? –

+0

Il se peut que le contrôle de connexion essaie d'utiliser le contenu de la zone de texte utilisateur comme nom d'utilisateur. – recursive

+0

Oui, j'ai supprimé le champ de texte de connexion et il se plaint, donc il doit le faire. –

10

Ne modifiez pas le contrôle de connexion existant, remplacez simplement l'événement 'Authenticate' pour que votre nouvelle logique personnalisée soit exécutée. Aussi la fonction FormsAuthentication.SetAuthCookie() devrait vous aider à remplacer les problèmes de nom d'utilisateur.

Je n'ai pas compilé, mais vous devriez avoir l'idée:

private void OnAuthenticate(object sender, AuthenticateEventArgs e) 
{ 
    bool successfulLogin = false; 
    string userName = Membership.GetUserNameByEmail(Login1.UserName); //the email address 
    successfulLogin = Membership.ValidateUser(userName, Login1.Password); 

    if(successfulLogin) 
     FormsAuthentication.SetAuthCookie(userName, true); 

    e.Authenticated = successfulLogin; 
} 
+0

Je ne sais pas à quoi je pensais. J'ai relu la question plus attentivement et c'est une bien meilleure réponse que la mienne. – womp

+0

Mon seul problème est que Membership.GetUser() est nul après. Ne devrais-je pas être capable de faire quelque chose comme Response.Write (Membership.GetUser(). UserName)? –

+0

Est-il NULL par la suite dans la même requête ou dans les requêtes suivantes? La propriété "HttpContext.Current.User.Identity" est remplie par un module asp.net intégré de sorte qu'il ne sera pas mis à jour jusqu'à la prochaine demande après l'authentification. –

1

Je vais avoir le même problème. Pour les pages suivantes ceci fonctionne très bien:

Response.Write(HttpContext.Current.User.Identity.Name); 

Mais cela me dit que l'utilisateur actuel est nul:

Response.Write(Membership.GetUser().UserName); 
0

C'est ma solution et son ok pour moi, LoginUser est le nom du contrôle de connexion.

protected void LoginUser_Authenticate(object sender, AuthenticateEventArgs e) 
{ 
    bool successfulLogin = false; 
    string userName = Membership.GetUserNameByEmail(LoginUser.UserName); //the email address 
    LoginUser.UserName = userName; //+++ Set username recovered by email. 
    successfulLogin = Membership.ValidateUser(userName, LoginUser.Password); 

    if (successfulLogin) 
     FormsAuthentication.SetAuthCookie(userName, true); 

    e.Authenticated = successfulLogin; 
}