web-dev-qa-db-fra.com

Comment obliger WebSecurity.Login à se connecter avec un nom d'utilisateur ou un email?

WebSecurity.Login dans simplemembership prenez nom d'utilisateur et mot de passe, comment le connecter à l'aide de nom d'utilisateur ou de courrier électronique au lieu de nom d'utilisateur?.

20
Amr Elgarhy

Vous pouvez hériter de SimpleMembershipProvider et simplement écraser la méthode ValidateUser comme ceci.

public class ExtendedSimpleMembershipProvider : SimpleMembershipProvider
{
    public override bool ValidateUser(string login, string password)
    {
        // check to see if the login passed is an email address
        if (IsValidEmail(login))
        {
            string actualUsername = base.GetUserNameByEmail(login);
            return base.ValidateUser(actualUsername, password);
        }
        else
        {
            return base.ValidateUser(login, password);
        }

    }

    bool IsValidEmail(string strIn)
    {
        // Return true if strIn is in valid e-mail format.
        return Regex.IsMatch(strIn, @"^([\w-\.]+)@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.)|(([\w-]+\.)+))([a-zA-Z]{2,4}|[0-9]{1,3})(\]?)$");
    }

}

Ceci est juste une approche. Vous pouvez écrire votre propre MembershipProvider, mais si vous devez seulement changer la méthode ValidateUser, cela devrait fonctionner.

Ajoutez la configuration suivante au fichier web.config pour configurer le fournisseur.

  <membership defaultProvider="ExtendedSimpleMembershipProvider">   
    <providers>
    <clear/>
    <add name="ExtendedSimpleMembershipProvider"
         type="MyProject.Web.SimpleMembershipProvider, MyProject.Web"/>
    </providers>
  </membership>

Cela devrait vous amener dans la bonne direction.

27
mezmi

WebSecurity appelle simplement FormsAuthentication sous le capot . Vous pouvez le faire:

if (WebSecurity.UserExists(username)) 
{
     FormsAuthentication.SetAuthCookie(username, false);
}

Vous voulez savoir pourquoi vous avez besoin de cette fonctionnalité. (Pour votre information, j’en ai besoin si un utilisateur s’authentifiait auprès de Paypal dans un flux de paiement express (panier). Je les autorisais à se connecter automatiquement à mon site en tant que même utilisateur, car j ne pas être la bonne personne). 

Peut être utile: Différence entre FormsAuthentication et WebSecurity

18
Simon_Weaver

Vous pouvez simplement extraire l'utilisateur avec un email donné depuis la table UserProfiles

 [HttpPost]
[AllowAnonymous]
[ValidateAntiForgeryToken]
public ActionResult Login(LoginModel model, string returnUrl)
{
  var login = false;
  if (ModelState.IsValid)
  {
    if (!model.UserName.Contains("@"))
    {
      if (WebSecurity.Login(model.UserName, model.Password, persistCookie: model.RememberMe))
        login = true;
    }
    else
    {
      var targetUser = db.UserProfiles.Where(u => u.Email == model.UserName).FirstOrDefault();
      if (targetUser != null && WebSecurity.Login(targetUser.UserName, model.Password, persistCookie: model.RememberMe))
        login = true;
    }

  }
  if (login)
    return Redirect(returnUrl);
  // If we got this far, something failed, redisplay form
  ModelState.AddModelError("", "The user name or password provided is incorrect.");
  return View(model);
}
2
user6856

N'utilisez pas le courrier électronique pour l'identification de l'utilisateur. C'est une chose très facile à deviner et aujourd'hui, les gens pourraient utiliser un outil pour le deviner. C'est pourquoi le nom d'utilisateur est utilisé, il pourrait être n'importe quoi.

Cela dit, si vous voulez vraiment - vous pouvez utiliser l'ID de la table où se trouvent le nom d'utilisateur/email + mot de passe et le faire correspondre en premier à un nom d'utilisateur. S'il échoue, faites-le correspondre à un email. Si les deux échouent, la connexion échoue.

Vous ne devriez avoir aucun problème à utiliser ceci ci-dessous pour votre code de vérification, puisque vous n'avez rien posté ici, je ne peux pas le modifier pour voir ce dont vous avez besoin.

WebSecurity.GetUserId(email);

Pour vos prochaines questions concernant MVC, vous devez d'abord consulter les forums ASP, puis essayer ici. Juste un avis

0
David D.