почему FindByNameAsyn c всегда возвращает ноль? - PullRequest
0 голосов
/ 21 марта 2020

пытаясь аутентифицировать токен с помощью почтового запроса, пользователь всегда возвращает ноль, когда я проверяю через имя пользователя.

    public async Task<IActionResult> Login([FromBody] LoginModel model)
    {
        var user = await _userManager.FindByNameAsync(model.UserName); // user always equals null here
        if (user !=null && await _userManager.CheckPasswordAsync(user,model.UserName))
        {
            var claims = new[]
            {
                new Claim(JwtRegisteredClaimNames.Sub, user.UserName),
                new Claim(JwtRegisteredClaimNames.Jti, Guid.NewGuid().ToString()),
            };

            var signingKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes("MySuperSecureKey"));

            var token = new JwtSecurityToken(
                issuer: "http://blah.com",
                audience: "http://blah.com",
                expires: DateTime.UtcNow.AddHours(1),
                claims: claims,
                signingCredentials: new SigningCredentials(signingKey, SecurityAlgorithms.HmacSha256)
            );

            return Ok(new
            {
                token = new JwtSecurityTokenHandler().WriteToken(token),
                expiration = token.ValidTo
            });
        }

        return Unauthorized();
    }

Интересно, проблема в том, как я заполнил свою базу данных этим фиктивным классом данных?

public class DummyData
{
    public static void Initialize(IApplicationBuilder app, IServiceProvider serviceProvider)
    {
        using (var serviceScope = app.ApplicationServices.GetService<IServiceScopeFactory>().CreateScope())
        {
            var context = serviceScope.ServiceProvider.GetService<HealthContext>();
            var userManager = serviceProvider.GetRequiredService<UserManager<ApplicationUser>>();
            context.Database.EnsureCreated();
            //context.Database.Migrate();

            // Look for any ailments
            if (context.Ailments != null && context.Ailments.Any())
                return;   // DB has already been seeded

            var ailments = GetAilments().ToArray();
            context.Ailments.AddRange(ailments);
            context.SaveChanges();

            var medications = GetMedications().ToArray();
            context.Medications.AddRange(medications);
            context.SaveChanges();

            var patients = GetPatients(context).ToArray();
            context.Patients.AddRange(patients);
            context.SaveChanges();

            if (!context.Users.Any())
            {
                ApplicationUser user = new ApplicationUser()
                {

                    Email = "andy@stav.com",
                    SecurityStamp = Guid.NewGuid().ToString(),
                    UserName = "AndyCosStav"

                };
                userManager.CreateAsync(user, "Password123");
                context.Users.Add(user);
                context.SaveChanges();
            }

        }
    }

После того, как я заполнил свою базу данных, я вижу, что мой пользователь создан в полях, его дефолт там, поэтому я не понимаю, в чем здесь проблема!

1 Ответ

0 голосов
/ 23 марта 2020

Прежде всего, проверьте базу данных, чтобы убедиться, что ваш пользователь успешно создан. Во-первых, вы можете проверить несколько проблем:

  1. Для userManager.FindByNameAsync подтвердите, что вы набираете AndyCosStav, а не адрес электронной почты.

  2. CheckPasswordAsync возвращает флаг, указывающий, является ли данный пароль действительным для указанного пользователя.

    public virtual System.Threading.Tasks.Task<bool> CheckPasswordAsync (TUser user, string password);
    

    Второй параметр должен быть паролем, я заметил, что вы проверяете имя пользователя:

    if (user !=null && await _userManager.CheckPasswordAsync(user,model.UserName))
    
  3. Password123 может не соответствовать значению по умолчанию ASP. NET Ограничение пароля для основного идентификатора, у вас должен быть хотя бы один не алфавитный символ c.

...