Asp.net core 我需要分别保存用户名和电子邮件地址。我有一个问题登录到该网站后,用户注册
我正在创建一个新的ASP.NET Core 2.2网站。默认情况下,用户名和电子邮件地址是相同的。我想让他们与众不同。当我尝试将该用户重新登录到网页时,问题就出现了 我构建了register Identity页面,并对后面的代码和Razor页面本身做了一些简单的更改,请参见下文。我也搭建了登录页面,但我不认为我需要在那里做任何更改,因为我仍然可以使用他们的电子邮件地址登录 下面是对Register.cshtml.cs页面的编辑 我将其添加到InputModel类中:Asp.net core 我需要分别保存用户名和电子邮件地址。我有一个问题登录到该网站后,用户注册,asp.net-core,identity,Asp.net Core,Identity,我正在创建一个新的ASP.NET Core 2.2网站。默认情况下,用户名和电子邮件地址是相同的。我想让他们与众不同。当我尝试将该用户重新登录到网页时,问题就出现了 我构建了register Identity页面,并对后面的代码和Razor页面本身做了一些简单的更改,请参见下文。我也搭建了登录页面,但我不认为我需要在那里做任何更改,因为我仍然可以使用他们的电子邮件地址登录 下面是对Register.cshtml.cs页面的编辑 我将其添加到InputModel类中: [Required] [St
[Required]
[StringLength(256, ErrorMessage = "The {0} must be at least {2} and at max {1} characters long.", MinimumLength = 5)]
[DataType(DataType.Text)]
[Display(Name = "User Name")]
public string UserName { get; set; }
我还更改了OnPostAsync方法中的用户
var user = new IdentityUser { UserName = Input.UserName, Email = Input.Email };
其他一切都是默认的
在页面本身上,我只是将其添加到电子邮件下方:
<div class="form-group">
<label asp-for="Input.UserName"></label>
<input asp-for="Input.UserName" class="form-control"/>
<span asp-validation-for="Input.UserName" class="text-danger"></span>
</div>
我希望用户能够正常登录,唉。我得到的错误只是无效的登录尝试。令人烦恼的是,我在进行任何更改之前创建的用户仍然可以很好地登录。因此,我的直觉告诉我,注册页面中有一些有趣的东西,我只是不确定在哪里。您必须修改SignInManager.PasswordSignIn方法。默认情况下,它使用FindByNameAsync检查是否存在具有给定名称的用户,您应该更改为FindByEmailAsync
创建新的SignInManager:
您必须修改SignInManager.PasswordSignIn方法。默认情况下,它使用FindByNameAsync检查是否存在具有给定名称的用户,您应该更改为FindByEmailAsync
创建新的SignInManager:
非常感谢。这很有魅力。我逐字添加了上面的代码,现在一切都正常了。非常感谢。@snussel,请单击绿色的复选按钮,将我的回答标记为答案,这可能会帮助遇到相同问题的其他人。我只想补充一点,在我的情况下,我必须在构造函数中添加另一个参数:IUserConfirmation confirmation谢谢!这很有魅力。我逐字添加了上面的代码,现在一切都正常了。非常感谢。@snussel,请单击绿色的复选按钮,将我的回答标记为答案,这可能会帮助其他遇到相同问题的人。我只想补充一点,在我的例子中,我必须在构造函数中添加另一个参数:IUserConfirmation
public class MySignInManager : SignInManager<IdentityUser>
{
public MySignInManager(Microsoft.AspNetCore.Identity.UserManager<Microsoft.AspNetCore.Identity.IdentityUser> userManager, Microsoft.AspNetCore.Http.IHttpContextAccessor contextAccessor, Microsoft.AspNetCore.Identity.IUserClaimsPrincipalFactory<Microsoft.AspNetCore.Identity.IdentityUser> claimsFactory, Microsoft.Extensions.Options.IOptions<Microsoft.AspNetCore.Identity.IdentityOptions> optionsAccessor, Microsoft.Extensions.Logging.ILogger<Microsoft.AspNetCore.Identity.SignInManager<Microsoft.AspNetCore.Identity.IdentityUser>> logger, Microsoft.AspNetCore.Authentication.IAuthenticationSchemeProvider schemes)
: base(userManager, contextAccessor, claimsFactory, optionsAccessor, logger, schemes)
{
}
public override async Task<SignInResult> PasswordSignInAsync(string userName, string password,
bool isPersistent, bool lockoutOnFailure)
{
var user = await UserManager.FindByEmailAsync(userName);
if (user == null)
{
return SignInResult.Failed;
}
return await PasswordSignInAsync(user, password, isPersistent, lockoutOnFailure);
}
}
services.AddDefaultIdentity<IdentityUser>()
.AddDefaultUI(UIFramework.Bootstrap4)
.AddSignInManager<MySignInManager>() //register new SignInManager
.AddEntityFrameworkStores<ApplicationDbContext>();