C# Can';t使用.net core 2.0中创建的用户登录

C# Can';t使用.net core 2.0中创建的用户登录,c#,asp.net-core,C#,Asp.net Core,我正在使用.NETCore2.0全新的全新项目。在用身份构建我的角色时,我也在创建一个用户。要创建用户,我有以下代码 var roleManager = serviceProvider.GetRequiredService<RoleManager<IdentityRole>>(); var userManager = serviceProvider.GetRequiredService<UserManager<ApplicationUser&g

我正在使用.NETCore2.0全新的全新项目。在用身份构建我的角色时,我也在创建一个用户。要创建用户,我有以下代码

var roleManager = serviceProvider.GetRequiredService<RoleManager<IdentityRole>>();
        var userManager = serviceProvider.GetRequiredService<UserManager<ApplicationUser>>();
        string[] roleNames = { "SuperAdmin", "Admin", "Support", "User" };

        IdentityResult roleResult;

        foreach (var roleName in roleNames)
        {
            var roleExist = await roleManager.RoleExistsAsync(roleName);
            if (!roleExist)
            {
                //create the roles and seed them to the database: Question 1
                roleResult = await roleManager.CreateAsync(new IdentityRole(roleName));
            }
        }

        // administrator
        var user = new ApplicationUser
        {
            UserName = "Administrator",
            Email = "something@something.com",
            EmailConfirmed = true
        };
        var i = await userManager.FindByEmailAsync(user.Email);
        if (i == null)
        {
            var adminUser = await userManager.CreateAsync(user, "Testing1!");
            if (adminUser.Succeeded)
            {
                await userManager.AddToRoleAsync(user, "SuperAdmin");
            }
        }
var rolemager=serviceProvider.GetRequiredService();
var userManager=serviceProvider.GetRequiredService();
字符串[]roleNames={“超级管理员”、“管理员”、“支持”、“用户”};
识别结果角色结果;
foreach(roleName中的变量roleName)
{
var roleExist=wait rolemager.RoleExistsAsync(roleName);
如果(!roleExist)
{
//创建角色并将其植入数据库:问题1
roleResult=await roleManager.CreateAsync(新的IdentityRole(roleName));
}
}
//管理员
var user=新应用程序用户
{
用户名=“管理员”,
电子邮件=”something@something.com",
emailconfirm=true
};
var i=await userManager.findbyemailsync(user.Email);
如果(i==null)
{
var adminUser=await userManager.CreateAsync(用户,“Testing1!”);
if(adminUser.successed)
{
wait userManager.AddToRoleAsync(用户,“超级管理员”);
}
}

用户创建,但当我尝试使用电子邮件和密码登录时,它显示为无效登录。

要解决此问题,我必须将用户名和电子邮件设置为与我希望用户通过电子邮件登录相同的值

PasswordSignInAsync
想要一个用户名,而不是电子邮件,所以我不得不使用它

// administrator
    var user = new ApplicationUser
    {
        UserName = "something@something.com",
        Email = "something@something.com",
        EmailConfirmed = true
    };

对于PasswordSignInAsync方法,您正在使用

wait_signInManager.PasswordSignInAsync(model.Email、model.Password、, model.RememberMe,锁定失败:false)

它需要用户名,而不是电子邮件。
SignInManager
上没有使用字符串
email
作为参数以使用密码登录的方法

    public virtual async Task<SignInResult> PasswordSignInAsync(string userName, string password,
        bool isPersistent, bool lockoutOnFailure)
公共虚拟异步任务密码SigninaSync(字符串用户名、字符串密码、,
bool Ispersist,bool LockoutOn故障)
请参阅:

如果您想使用电子邮件地址而不是用户名,请使用以下选项:

public virtual async Task<SignInResult> CheckPasswordSignInAsync(TUser user, string password, bool lockoutOnFailure)
public虚拟异步任务CheckPasswordSignInAsync(t用户、字符串密码、bool lockoutOnFailure)
或:

公共虚拟异步任务密码符号同步(t用户,字符串密码,
bool Ispersist,bool LockoutOn故障)
您的评论:


默认标识安装使用用户名,该用户名设置为 当有人注册时发送电子邮件。那么值是一样的这就是为什么我 需要在创建时将用户名更改为电子邮件。非常感谢。 尽管如此,我还是对这一回应表示感谢。这将帮助我不必不断地 当然,如果有人想更改登录名,我会更新两个字段 电子邮件

对于默认值,这可能是正确的;但是,它并不反映实际代码以及如何解析登录。源代码显然使用用户名而不是电子邮件地址来查找您正在使用的登录操作的用户

   public virtual async Task<SignInResult> PasswordSignInAsync(string userName, string password,
        bool isPersistent, bool lockoutOnFailure)
    {
        var user = await UserManager.FindByNameAsync(userName);
        if (user == null)
        {
            return SignInResult.Failed;
        }

        return await PasswordSignInAsync(user, password, isPersistent, lockoutOnFailure);
    }
公共虚拟异步任务密码SigninaSync(字符串用户名、字符串密码、,
bool Ispersist,bool LockoutOn故障)
{
var user=await UserManager.FindByNameAsync(用户名);
if(user==null)
{
返回信号结果失败;
}
return wait PasswordSignInAsync(用户、密码、ispersist、lockoutOnFailure);
}
替代解决方案

此方法使用
UserManager
通过用户的电子邮件或用户名查找用户,然后使用
SignInManager
尝试使用
PasswordSignInAsync
重载方法登录用户:

public virtual async Task<SignInResult> PasswordSignInAsync(TUser user, string password,
        bool isPersistent, bool lockoutOnFailure)

这将允许您使用电子邮件地址或用户名进行登录。

您使用什么方法登录用户。例如,在SignInManager上,是否使用PasswordSignInAsync?您使用的参数是什么(model.email,model.xxxxx)?如果您使用的是所有默认参数,则需要使用
用户名登录,而不是
电子邮件登录。当我注册用户时,我可以使用emaol和password@BrennanMann这就是我使用var result=await _signInManager.PasswordSignInAsync的原因(model.Email,model.Password,model.RememberMe,lockoutOnFailure:false);我刚刚查看了源代码…Task PasswordSignInAsync(字符串用户名,字符串密码,…您可以尝试使用用户名吗?默认的Identity安装使用用户名,当有人注册时,它会将用户名设置为电子邮件。然后,值是相同的,这就是为什么我需要在创建时将用户名更改为电子邮件的原因。谢谢您的回复。这将帮助我不必经常使用用户名e如果有人想更改他们的登录电子邮件,我肯定会更新两个字段。@Dizzle您必须了解整个情况。我添加了您正在调用的实际代码。您使用的signin方法使用用户名,而不是电子邮件。这与默认值无关。这是不正确的。用户名和电子邮件地址不必是相同的值。提出问题的用户不理解他或她正在使用的PasswordSignInAsync例程。该例程显然使用用户名而不是电子邮件地址。请参见上文。@TheDizzleI了解它需要用户名和密码。当您使用Individual启动新项目时它要求电子邮件和密码的双帐户。它将电子邮件和用户名设置为注册时的电子邮件。然后,用户名字段被禁用,用户无法更改。我知道它要求的用户名与您注册的电子邮件的值相同。这就是我的登录无法工作的原因,因为默认情况下,它将电子邮件设置为用户名。Whe我把它设为管理员
public virtual async Task<SignInResult> PasswordSignInAsync(TUser user, string password,
        bool isPersistent, bool lockoutOnFailure)
    private readonly UserManager<ApplicationUser> _userManager;
    private readonly SignInManager<ApplicationUser> _signInManager;

    ....

   /// <summary>
    /// Handle postback from username/password login
    /// </summary>
    [HttpPost]
    [ValidateAntiForgeryToken]
    public async Task<IActionResult> Login(LoginInputModel model, string button)
    {
        try
        {
            if (!ModelState.IsValid)
            {
                return await ReturnLoginError(model);
            }

            ApplicationUser user = await _userManager.FindByEmailAsync(model.Email) 
                                   ?? await _userManager.FindByNameAsync(model.Username);

            SignInResult signInResult = await _signInManager.PasswordSignInAsync(user, model.Password, isPersistent: true,
                lockoutOnFailure: true);

             ...
      }