如何在ASP.Net Web Forms Identity中使用“用户名”而不是“电子邮件地址”进行登录

6
我需要将我的登录设置为使用用户名而不是电子邮件地址,我该如何更改? 我已经到处查找,但它们都是MVC代码而不是Web表单。
感谢您努力为解决我的问题做出的努力。
using System;
using System.Web;
using System.Web.UI;
using Microsoft.AspNet.Identity;
using Microsoft.AspNet.Identity.Owin;
using Owin;
using Web_WebApp.Models;

namespace Web_WebApp.Account
{
    public partial class Login : Page
    {
        protected void Page_Load(object sender, EventArgs e)
        {
            RegisterHyperLink.NavigateUrl = "Register";
            // Enable this once you have account confirmation enabled for password reset functionality
            //ForgotPasswordHyperLink.NavigateUrl = "Forgot";
            OpenAuthLogin.ReturnUrl = Request.QueryString["ReturnUrl"];
            var returnUrl = HttpUtility.UrlEncode(Request.QueryString["ReturnUrl"]);
            if (!String.IsNullOrEmpty(returnUrl))
            {
                RegisterHyperLink.NavigateUrl += "?ReturnUrl=" + returnUrl;
            }
        }

        protected void LogIn(object sender, EventArgs e)
        {
            if (IsValid)
            {
                // Validate the user password
                var manager = Context.GetOwinContext().GetUserManager<ApplicationUserManager>();
                var signinManager = Context.GetOwinContext().GetUserManager<ApplicationSignInManager>();

                // This doen't count login failures towards account lockout
                // To enable password failures to trigger lockout, change to shouldLockout: true
                var result = signinManager.PasswordSignIn(UserName.Text, Password.Text, RememberMe.Checked, shouldLockout: false);

                switch (result)
                {
                    case SignInStatus.Success:
                        IdentityHelper.RedirectToReturnUrl(Request.QueryString["ReturnUrl"], Response);
                        break;
                    case SignInStatus.LockedOut:
                        Response.Redirect("/Account/Lockout");
                        break;
                    case SignInStatus.RequiresVerification:
                        Response.Redirect(String.Format("/Account/TwoFactorAuthenticationSignIn?ReturnUrl={0}&RememberMe={1}", 
                                                        Request.QueryString["ReturnUrl"],
                                                        RememberMe.Checked),
                                          true);
                        break;
                    case SignInStatus.Failure:
                    default:
                        FailureText.Text = "Invalid login attempt";
                        ErrorMessage.Visible = true;
                        break;
                }
            }
        }
    }
}

using System;
using System.Linq;
using System.Web;
using System.Web.UI;
using Microsoft.AspNet.Identity;
using Microsoft.AspNet.Identity.Owin;
using Owin;
using Web_WebApp.Models;


namespace Web_WebApp.Account
{
    public partial class Register : Page
    {
        protected void CreateUser_Click(object sender, EventArgs e)
        {

            var manager = Context.GetOwinContext().GetUserManager<ApplicationUserManager>();
            var signInManager = Context.GetOwinContext().Get<ApplicationSignInManager>();
            var user = new ApplicationUser() { UserName = UserName.Text, Email = Email.Text, FirstName = FirstName.Text, MiddleName = MiddleName.Text, LastName = LastName.Text };
            IdentityResult result = manager.Create(user, Password.Text);
            if (result.Succeeded)
            {
                // For more information on how to enable account confirmation and password reset please visit http://go.microsoft.com/fwlink/?LinkID=320771
                //string code = manager.GenerateEmailConfirmationToken(user.Id);
                //string callbackUrl = IdentityHelper.GetUserConfirmationRedirectUrl(code, user.Id, Request);
                //manager.SendEmail(user.Id, "Confirm your account", "Please confirm your account by clicking <a href=\"" + callbackUrl + "\">here</a>.");

                signInManager.SignIn( user, isPersistent: false, rememberBrowser: false);
                IdentityHelper.RedirectToReturnUrl(Request.QueryString["ReturnUrl"], Response);
            }
            else 
            {
                ErrorMessage.Text = result.Errors.FirstOrDefault();
            }
        }
    }
}

在我的身份用户表中,我有两个字段1)电子邮件2)用户名,默认情况下,当您注册时,用户名实际上是从电子邮件派生的。我已更改此设置,因此在注册期间我需要输入两个字段1)电子邮件2)用户名。但默认情况下,登录要求输入电子邮件。我不知道应该在哪里更改这个设置。看起来MVC程序员更加快乐,因为更容易更改它。 - Kevin Maxwell
那么,您只需编写一个函数,该函数会通过用户名查找电子邮件。它将接受一个字符串(用户名)并返回一个字符串(电子邮件)? - Gnqz
我该如何做到这一点,以及在哪里可以实现? - Kevin Maxwell
你提到了身份用户表。它是SQL、MySQL还是Access? - Gnqz
我还没有完成那个。我以为会有一种方法可以指向用户名而不是电子邮件。 - Kevin Maxwell
显示剩余8条评论
2个回答

2
如果您查看 SignInManagerExtensions.PasswordSignIn MSDN ,它会告诉您在PasswordSignIn 方法中的第一个参数是 userName
MVC和WebForms默认将此设置为电子邮件,因为您使用电子邮件地址注册。您也可以更改“注册”操作,以允许使用用户名注册。这样做会默认将电子邮件添加为用户名和电子邮件在数据库中。
protected void CreateUser_Click(object sender, EventArgs e)
{
    // ...
    // UserName and Email are both set to Email.text
    // Add a UserName TextBox and Replace UserName = Email.Text with UserName = UserName.Text
    var user = new ApplicationUser() { UserName = Email.Text, Email = Email.Text };
    // ...
}


protected void LogIn(object sender, EventArgs e)
{
    if (IsValid)
    {
        // ...
        // The first argument is userName
        // Replace mail.Text with UserName.Text
        var result = signinManager.PasswordSignIn(mail.Text, Password.Text, RememberMe.Checked, shouldLockout: false);
        // ..
    }
}

替换:

<div class="form-group">
    <asp:Label runat="server" AssociatedControlID="Email" CssClass="col-md-2 control-label">Email</asp:Label>
    <div class="col-md-10">
        <asp:TextBox runat="server" ID="Email" CssClass="form-control" TextMode="Email" />
        <asp:RequiredFieldValidator runat="server" ControlToValidate="Email"
            CssClass="text-danger" ErrorMessage="The email field is required." />
    </div>
</div>

使用:

<div class="form-group">
    <asp:Label runat="server" AssociatedControlID="UserName" CssClass="col-md-2 control-label">UserName</asp:Label>
    <div class="col-md-10">
        <asp:TextBox runat="server" ID="UserName" CssClass="form-control" />
        <asp:RequiredFieldValidator runat="server" ControlToValidate="UserName"
            CssClass="text-danger" ErrorMessage="The username field is required." />
    </div>
</div>

我希望你能理解这个。


那么你使用用户名和电子邮件注册了一个新用户? - shammelburg
是的,我确定。我刚试过了,它可以工作。我正在身份用户表中添加一些额外的信息,例如名字、中间名和姓氏。 - Kevin Maxwell
我还无法使用用户名登录,怎么能愉快地体验呢?注册流程非常顺畅,但在登录过程中,我被强制使用电子邮件作为登录凭据,而我需要将其更改为用户名。 - Kevin Maxwell
你能确保在后台代码中登录时,UserName.Text有一个值吗?这对我来说非常奇怪,因为它对我有效。你可能需要分享更多的代码让我更好地查看。 - shammelburg
你的解决方案实际上起作用了。Sam 的另一个解决方案也有效。有没有办法将你们两个都标记为已完成? - Kevin Maxwell
显示剩余8条评论

2

您可以通过用户名或任何您想要的方式简单地查找用户,然后直接使用 SignIn 方法登录用户:

protected void LogIn(object sender, EventArgs e)
{
    if (IsValid)
    {
        // Validate the user password
        var manager = Context.GetOwinContext().GetUserManager<ApplicationUserManager>();
        var signinManager = Context.GetOwinContext().GetUserManager<ApplicationSignInManager>();

        // assuming you have a text box named UserName
        var user=manager.FindByName(UserName.Text);
        // or for advanced scenarios you can write:
        // var user = manager.Users.FirstOrDefault(u => u.UserName == UserName.Text);
        if(user !=null)
        {
            if(manager.CheckPassword(user, Password.Text))
            {
                signinManager.SignIn(user, false, RememberMe.Checked);
                IdentityHelper.RedirectToReturnUrl(Request.QueryString["ReturnUrl"], Response);
            }
        }
    }
    FailureText.Text = "Invalid login attempt";
    ErrorMessage.Visible = true;
}

你能提交你的注册用户方法吗? - Sam FarajpourGhamari
当您使用我的代码时会发生什么?出现错误了吗?还是其他情况? - Sam FarajpourGhamari
你的解决方案实际上起作用了。Sander 的另一个解决方案也有效。有没有办法将你们两个都标记为已完成? - Kevin Maxwell
据我理解,在注册过程中,第一个参数 var user = new ApplicationUser() { UserName = UserName.Text, Email = Email.Text, FirstName = FirstName.Text, MiddleName = MiddleName.Text, LastName = LastName.Text } 中的 UserName 参数是用于登录会话的主要顺序。正确吗? - Kevin Maxwell
非常感谢 @Sam 的帮助和支持。 - Kevin Maxwell
显示剩余8条评论

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