如何使用用户名或电子邮件使WebSecurity.Login登录?

Amr*_*rhy 20 asp.net-mvc-4 .net-4.5 simplemembership

WebSecurity.Login 在simplemembership中使用用户名和密码,如何使用用户名或电子邮件而不是用户名?来登录用户,以使用户可以自由输入他的电子邮件或用户名进行登录.

mat*_*tt. 27

你可以继承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})(\]?)$");
    }

}
Run Code Online (Sandbox Code Playgroud)

这只是一种方法.您可以编写自己的,MembershipProvider但如果您只需要更改ValidateUser方法,这应该可行.

将以下配置添加到web.config以设置提供程序.

  <membership defaultProvider="ExtendedSimpleMembershipProvider">   
    <providers>
    <clear/>
    <add name="ExtendedSimpleMembershipProvider"
         type="MyProject.Web.SimpleMembershipProvider, MyProject.Web"/>
    </providers>
  </membership>
Run Code Online (Sandbox Code Playgroud)

这应该让你朝着正确的方向前进.


Sim*_*ver 18

WebSecurity只是FormsAuthentication在引擎盖下打电话.你可以这样做:

if (WebSecurity.UserExists(username)) 
{
     FormsAuthentication.SetAuthCookie(username, false);
}
Run Code Online (Sandbox Code Playgroud)

好奇为什么你需要这个功能.(仅供参考:我的理由是,如果用户在快速结账(购物车)流程中使用PayPal进行了身份验证,我允许他们以相同的用户身份自动登录到我的网站,因为我认为风险非常低不是合适的人).

可能有用:FormsAuthentication和WebSecurity之间的区别