Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/scheme/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Asp.net core 我需要分别保存用户名和电子邮件地址。我有一个问题登录到该网站后,用户注册_Asp.net Core_Identity - Fatal编程技术网

Asp.net core 我需要分别保存用户名和电子邮件地址。我有一个问题登录到该网站后,用户注册

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

我正在创建一个新的ASP.NET Core 2.2网站。默认情况下,用户名和电子邮件地址是相同的。我想让他们与众不同。当我尝试将该用户重新登录到网页时,问题就出现了

我构建了register Identity页面,并对后面的代码和Razor页面本身做了一些简单的更改,请参见下文。我也搭建了登录页面,但我不认为我需要在那里做任何更改,因为我仍然可以使用他们的电子邮件地址登录

下面是对Register.cshtml.cs页面的编辑

我将其添加到InputModel类中:

[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>();