WebSecurity.Login
в simplemembership введите имя пользователя и пароль, как заставить его войти в систему, используя имя пользователя или адрес электронной почты вместо имени пользователя?, чтобы пользователь мог ввести свой адрес электронной почты или имя пользователя для входа.
Как сделать WebSecurity.Login для входа с использованием имени пользователя или электронной почты?
Ответ 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, а затем попробовать здесь. Просто мнение