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?.
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.
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
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);
}
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