如何使用电子邮件在身份2中登录?

23

MVC5 Identity 2中的SignInManager.PasswordSignInAsync使用用户名进行登录。

var result = await SignInManager.PasswordSignInAsync(model.Email, model.Password, model.RememberMe, shouldLockout: false);

但是我的用户名和电子邮件不同。我想用电子邮件地址登录。那我该怎么做呢?谢谢。

2个回答

51

通过电子邮件从UserManager获取用户。

var user = UserManager.FindByEmail(email);

接着使用SignInManager的PasswordSignInAsync方法,使用用户的用户名进行登录

var result = await SignInManager
.PasswordSignInAsync(user.UserName,password,isPersistent,shouldLockout);

或者在你的SignInManager中添加这个方法(ASP.NET Identity讨论)

public async Task<SignInStatus> PasswordEmailSignInAsync(string email, string password, bool isPersistent, bool shouldLockout)
{
      var user =  UserManager.FindByEmail(email);
      return await PasswordSignInAsync(user.UserName,password,isPersistent,shouldLockout);
}

然后像使用PasswordSignInAsync一样使用它,但是使用用户的电子邮件而不是用户名。


就像身份框架2.0这样的不透明向导经常发生的情况一样,我不会说我完全理解它,但它像梦想一样工作。在MVC身份框架2中将用户名和电子邮件地址分离的博客上使用它非常有帮助:http://marcinjuraszek.com/2014/03/asp-net-identity-2-0-0-username-and-email-separation.html - Andy Brown
这个密码已经加密了,你能直接在 PasswordSignInAsync 方法中使用吗? - Gayan
@GayanRanasinghe PasswordHash 存储在数据库中。在这些方法中,password 参数是原始密码。 - tmg
啊我的坏,我刚注意到你从来没有使用存储密码,抱歉。 - Gayan
1
如果有多个用户使用相同的电子邮件地址怎么办?如果你将电子邮件字段设为唯一的,那么在注册之前必须确认电子邮件地址,因为X人可以使用Y人的电子邮件地址而无需确认。这会导致Y人无法注册,因为他的电子邮件地址已被X注册。 - ninbit

3
我们希望用户可以通过用户名或电子邮件登录。以下是我们的设置方法:
var isEmail = ValidationManager.IsValidEmailAddress(model.Username);

SignInStatus result = SignInStatus.Failure;

if (!isEmail)
   {
       result = await SignInManager.PasswordSignInAsync(model.Username, model.Password, model.RememberMe, false);
   }
   else
   {
       var user = await UserManager.FindByEmailAsync(model.Username);
       if (user != null)
           result = await SignInManager.PasswordSignInAsync(user.UserName, model.Password, model.RememberMe, false);
   }

IsValidEmailAddress是属性装饰器[EmailAddress]验证属性的自定义版本,我们没有使用内置的原因是它不会对TLD进行长度检查,并允许像x@x.c这样的电子邮件地址。

public static bool IsValidEmailAddress(string email)
    {
        if (string.IsNullOrEmpty(email))
            return false;

        var pattern = GlobalConstants.EMAIL_VALIDATION_PATTERN;
        const RegexOptions options = RegexOptions.Compiled | RegexOptions.IgnoreCase | RegexOptions.ExplicitCapture;

        var emailValidator = new Regex(pattern,options);

        return emailValidator.IsMatch(email);
    }

正则表达式模式:
public const string EMAIL_VALIDATION_PATTERN = @"^((([a-z]|\d|[!#\$%&'\*\+\-\/=\?\^_`{\|}~]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])+(\.([a-z]|\d|[!#\$%&'\*\+\-\/=\?\^_`{\|}~]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])+)*)|((\x22)((((\x20|\x09)*(\x0d\x0a))?(\x20|\x09)+)?(([\x01-\x08\x0b\x0c\x0e-\x1f\x7f]|\x21|[\x23-\x5b]|[\x5d-\x7e]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(\\([\x01-\x09\x0b\x0c\x0d-\x7f]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF]))))*(((\x20|\x09)*(\x0d\x0a))?(\x20|\x09)+)?(\x22)))@((([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])*([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])))\.)+(([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])*([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF]))){2,63}\.?$";

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接