无法使用.net core 2.0中创建的用户登录

The*_*zle 2 c# asp.net-core

我正在使用.net core 2.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");
            }
        }
Run Code Online (Sandbox Code Playgroud)

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

Bre*_*ann 5

对于您正在使用的 PasswordSignInAsync 方法...

等待 _signInManager.PasswordSignInAsync(model.Email, model.Password, model.RememberMe, lockoutOnFailure: false);

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

    public virtual async Task<SignInResult> PasswordSignInAsync(string userName, string password,
        bool isPersistent, bool lockoutOnFailure)
Run Code Online (Sandbox Code Playgroud)

请参阅: https: //github.com/aspnet/Identity/blob/dev/src/Identity/SignInManager.cs#L297

如果您想使用电子邮件地址而不是用户名,请查看使用以下内容:

public virtual async Task<SignInResult> CheckPasswordSignInAsync(TUser user, string password, bool lockoutOnFailure)
Run Code Online (Sandbox Code Playgroud)

或者:

public virtual async Task<SignInResult> PasswordSignInAsync(TUser user, string password,
        bool isPersistent, bool lockoutOnFailure)
Run Code Online (Sandbox Code Playgroud)

你的评论:

默认身份安装使用用户名,当有人注册时将其设置为电子邮件。那么这些值是相同的,这就是为什么我需要在创建时将用户名更改为电子邮件。不过还是谢谢你的回复。如果有人想更改他们的登录电子邮件,这将帮助我不必不断确保我正在更新两个字段。

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

   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);
    }
Run Code Online (Sandbox Code Playgroud)