2012-09-13 20 views

Respuesta

27

Puede heredar de SimpleMembershipProvider y simplemente anular el método ValidateUser de esta manera.

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})(\]?)$"); 
    } 

} 

Este es solo un enfoque. Puede escribir su propio MembershipProvider, pero si solo necesita cambiar el método ValidateUser, esto debería funcionar.

Agregue la siguiente configuración a web.config para configurar el proveedor.

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

Eso debería hacerlo avanzar en la dirección correcta.

0

No utilice el correo electrónico para la identificación del usuario. Es algo muy fácil de adivinar y hoy la gente podría usar una herramienta para adivinar eso por ellos. Es por eso que se usa el nombre de usuario, podría ser cualquier cosa.

Dicho esto, si realmente lo desea, puede usar el ID de la tabla donde se encuentra el nombre de usuario/correo electrónico + contraseña y asociarlo primero a un nombre de usuario y si eso no coincide con un correo electrónico. Si ambos fallan, el inicio de sesión falla.

No debería tener problemas al utilizar esto a continuación en su código de cheque, ya que no ha publicado nada aquí no puedo modificarlo para ver lo que necesita.

WebSecurity.GetUserId(email); 

Para sus próximas preguntas con respecto a MVC, primero debe comprobar los foros ASP e intentar aquí. Sólo una opinión

+2

estaría de acuerdo en que es fácil de adivinar, pero el usuario medio se va a utilizar o algo fácil de adivinar de todos modos. Digamos que tenías a David Jones. Él podría usar, david.jones, jonesd, djones. Pero todos son ridículamente imaginables, así que no creo que suponga una gran diferencia. – rashleighp

18

WebSecurity solo llama a FormsAuthentication debajo del capó. Usted puede hacer esto:

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

curioso por qué necesita esta característica. (Para su información, mi razonamiento es que si un usuario se ha autenticado con PayPal en un flujo de Express Checkout (carrito de compras), les permito iniciar sesión automáticamente en mi sitio como ese mismo usuario porque considero el riesgo muy bajo de que lo haría no ser la persona adecuada).

pueden ser de utilidad: Difference between FormsAuthentication and WebSecurity

+0

He entendido mal la pregunta y pensé que querías decir * sin contraseña *, así que para eso es una respuesta :) –

2

Usted puede simplemente tirar del usuario con correo electrónico dada de la mesa 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); 
} 
Cuestiones relacionadas