Подтвердить что ты не робот

Как сделать WebSecurity.Login для входа с использованием имени пользователя или электронной почты?

WebSecurity.Login в simplemembership введите имя пользователя и пароль, как заставить его войти в систему, используя имя пользователя или адрес электронной почты вместо имени пользователя?, чтобы пользователь мог ввести свой адрес электронной почты или имя пользователя для входа.

4b9b3361

Ответ 1

Вы можете наследовать от SimpleMembershipProvider и просто переопределить метод ValidateUser, подобный этому.

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

}

Это всего лишь один подход. Вы можете написать свой собственный MembershipProvider, но если вам нужно изменить метод ValidateUser, это должно сработать.

Добавьте следующую конфигурацию в web.config, чтобы настроить поставщика.

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

Это должно заставить вас идти в правильном направлении.

Ответ 2

WebSecurity просто вызывает FormsAuthentication под капотом. Вы можете сделать это:

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

Любопытно, зачем нужна эта функция. (FYI: мои аргументы в пользу этого - если пользователь аутентифицировался с помощью PayPal в потоке экспресс-доставки (корзины покупок), я разрешаю им автоматически регистрироваться на моем сайте как тот же пользователь, потому что я считаю, что риск очень низкий, не быть правильным человеком).

Может быть полезным: Разница между FormsAuthentication и WebSecurity

Ответ 3

Вы можете просто вытащить пользователя с заданным адресом электронной почты из таблицы 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);
}

Ответ 4

Не используйте адрес электронной почты для идентификации пользователя. Это очень легко догадаться, и сегодня люди могут использовать инструмент, чтобы догадаться, что для них. Вот почему используется имя пользователя, это может быть что угодно.

С учетом сказанного, если вы действительно этого хотите, вы можете использовать идентификатор таблицы, в которой находится имя пользователя/адрес электронной почты +, и сначала сопоставлять ее с именем пользователя, а если это не соответствует ему по электронной почте. Если оба пользователя не работают, логин завершается с ошибкой.

У вас не должно возникнуть проблем с использованием этого ниже для вашего кода проверки, поскольку вы ничего не публиковали здесь, я не могу изменить, чтобы узнать, что вам нужно.

WebSecurity.GetUserId(email);

Для ваших следующих вопросов относительно MVC вы должны сначала проверить форумы ASP, а затем попробовать здесь. Просто мнение