ASP.NET登录控件,使用电子邮件进行登录但电子邮件不是用户名(如何处理)?

3
使用ASP.NET表单身份验证,您如何接受电子邮件地址和密码,使用电子邮件地址查找用户名,然后使用查找到的用户名和密码登录?
我们有这个员工卡系统,其中包含员工编号,但没有人能记住他们的编号。显而易见的是使用电子邮件地址进行登录,但应用程序的其余部分依赖于用户名是员工编号。
谢谢。代码链接/示例将很好。
我们目前的C#解决方案在以下代码处以空引用异常结束:
Response.Write(Membership.GetUser().UserName);
但这两个都可以正常工作:
string userName = Membership.GetUserNameByEmail(emailAddress); bool successfulLogin = Membership.ValidateUser(userName, password);

如果您尝试:Response.Write(Membership.GetuserNameByEmail(emailAddress).UserName)会发生什么? - James Black
4个回答

10

不要改变现有的登录控件,只需覆盖'Authenticate'事件来执行您的新自定义逻辑。此外,FormsAuthentication.SetAuthCookie()函数应该帮助您解决用户名问题。

我还没有编译这个代码,但您应该可以理解思路:

private void OnAuthenticate(object sender, AuthenticateEventArgs e)
{
    bool successfulLogin = false;
    string userName = Membership.GetUserNameByEmail(Login1.UserName); //the email address
    successfulLogin = Membership.ValidateUser(userName, Login1.Password);

    if(successfulLogin)
      FormsAuthentication.SetAuthCookie(userName, true);

    e.Authenticated = successfulLogin;
}

我不知道当时在想什么。我仔细重新阅读了问题,这个答案比我的好多了。 - womp
我的唯一问题是Membership.GetUser()之后为空。我不应该能够像Response.Write(Membership.GetUser().UserName)这样做吗? - Zachary Scott
在相同的请求中还是在后续请求中它是否为null?"HttpContext.Current.User.Identity"属性是由内置的asp.net模块填充的,因此在身份验证之后它不会被更新,直到下一个请求。 - Brendan Kowitz
它在同一和后续请求中都为null。然而,FormsAuthentication.RedirectFromLoginPage在后续页面中有效。我不确定第一个为什么有效但第二个失败了: successfulLogin = Membership.ValidateUser(myName, Login1.Password); successfulLogin = FormsAuthentication.Authenticate(myName, Login1.Password); 第二个在登录表单和目标页面中都失败了。 - Zachary Scott
不确定这是否有帮助,但我注意到的另一件事是,在此过程中,代替 "FormsAuthentication.SetAuthCookie(userName, true)",如果授权已成功,则可以输入所需的用户名 "Login1.UserName = userName;",正常的登录过程将为您设置正确的cookie。 - Brendan Kowitz
显然,Login1.UserName是只读的。它真的需要那个Username,因为没有它会导致构建失败。 - Zachary Scott

3
不要使用登录控件。只需放置您自己的文本框并执行自己的身份验证逻辑。如果用户通过,请调用FormsAuthentication.RedirectFromLoginPage
只要您可以从他们的电子邮件中查找用户名,这将使他们无需输入用户名即可登录。
请参见文档

我必须说,这个方法可行。这是一个很好的解决办法。我只是不确定为什么默认的登录控件会失败? - Zachary Scott
可能是因为登录控件试图将用户文本框的内容用作用户名。 - recursive
是的,我删除了登录文本字段,它会出现错误提示,所以肯定是那里出了问题。 - Zachary Scott

1

我遇到了完全相同的问题。在后续的页面加载中,这个可以正常工作:

Response.Write(HttpContext.Current.User.Identity.Name);

但是这告诉我当前用户为空:

Response.Write(Membership.GetUser().UserName);

0

这是我的解决方案,对我来说很好,LoginUser 是登录控件的名称。

protected void LoginUser_Authenticate(object sender, AuthenticateEventArgs e)
{
    bool successfulLogin = false;
    string userName = Membership.GetUserNameByEmail(LoginUser.UserName); //the email address
    LoginUser.UserName = userName; //+++ Set username recovered by email. 
    successfulLogin = Membership.ValidateUser(userName, LoginUser.Password);

    if (successfulLogin)
        FormsAuthentication.SetAuthCookie(userName, true);

    e.Authenticated = successfulLogin;
}

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