Как проверить правильность имени пользователя и пароля в существующей базе данных с помощью PasswordHash и SecurityStamp?

Я новичок в Asp.Net Core. Я реализовал аутентификацию и авторизацию на основе токенов-носителей JWT. Токен создан успешно, но в существующей базе данных таблица AspNetUser содержит пароль в зашифрованном формате со столбцами PasswordHash и SecurityStamp. Итак, как я могу проверить имя пользователя и пароль из базы данных?

Пожалуйста, найдите приведенный ниже код частичного класса Startup для создания токена:

    // This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
    public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory)
    {
        loggerFactory.AddConsole(Configuration.GetSection("Logging"));
        loggerFactory.AddDebug();


        ConfigureAuth(app);

        app.UseMvc();
    }

и

public partial class Startup
{
    // The secret key every token will be signed with.
    // Keep this safe on the server!
    private static readonly string secretKey = "mysupersecret_secretkey!123";

    private void ConfigureAuth(IApplicationBuilder app)
    {
        var signingKey = new SymmetricSecurityKey(Encoding.ASCII.GetBytes(secretKey));

        app.UseSimpleTokenProvider(new TokenProviderOptions
        {
            Path = "/api/token",
            Audience = "ExampleAudience",
            Issuer = "ExampleIssuer",
            SigningCredentials = new SigningCredentials(signingKey, SecurityAlgorithms.HmacSha256),
            IdentityResolver = GetIdentity
        });

        var tokenValidationParameters = new TokenValidationParameters
        {
            // The signing key must match!
            ValidateIssuerSigningKey = true,
            IssuerSigningKey = signingKey,

            // Validate the JWT Issuer (iss) claim
            ValidateIssuer = true,
            ValidIssuer = "ExampleIssuer",

            // Validate the JWT Audience (aud) claim
            ValidateAudience = true,
            ValidAudience = "ExampleAudience",

            // Validate the token expiry
            ValidateLifetime = true,

            // If you want to allow a certain amount of clock drift, set that here:
            ClockSkew = TimeSpan.Zero
        };

        app.UseJwtBearerAuthentication(new JwtBearerOptions
        {
            AutomaticAuthenticate = true,
            AutomaticChallenge = true,
            TokenValidationParameters = tokenValidationParameters
        });

        app.UseCookieAuthentication(new CookieAuthenticationOptions
        {
            AutomaticAuthenticate = true,
            AutomaticChallenge = true,
            AuthenticationScheme = "Cookie",
            CookieName = "access_token",
            TicketDataFormat = new CustomJwtDataFormat(
                SecurityAlgorithms.HmacSha256,
                tokenValidationParameters)
        });
    }

    private Task<ClaimsIdentity> GetIdentity(string username, string password)
    {
        // Here i want to match username and password with passwordHash and SecurityStamp
        if (username == "TEST" && password == "TEST123")
        {
            return Task.FromResult(new ClaimsIdentity(new GenericIdentity(username, "Token"), new Claim[] { }));
        }

        // Credentials are invalid, or account doesn't exist
        return Task.FromResult<ClaimsIdentity>(null);
    }
}

В приведенном выше коде я проверяю имя пользователя и пароль с жестко закодированным значением, но мне нужно сделать то же самое, используя существующую базу данных с таблицей AspNetUser (автоматически созданной MVC5)

Спасибо


person Sumit Singh    schedule 09.08.2017    source источник
comment
При чем тут jwt? Кажется, не имеет отношения к этому вопросу.   -  person Ruard van Elburg    schedule 09.08.2017
comment
JWT для генерации токена для возврата после проверки электронной почты и пароля   -  person Sumit Singh    schedule 09.08.2017
comment
Но у вас нет проблем с генерацией токена, так зачем упоминать об этом? В любом случае, будет полезно, если вы добавите информацию, например, какие (пакеты) вы использовали для обеспечения безопасности? Вы внедрили менеджера пользователей? Можете ли вы показать какой-нибудь (соответствующий) код?   -  person Ruard van Elburg    schedule 09.08.2017
comment
@RuardvanElburg я обновил вопрос, пожалуйста, проверьте   -  person Sumit Singh    schedule 10.08.2017
comment
у меня нет реализации usermanager   -  person Sumit Singh    schedule 10.08.2017
comment
Вам нужно будет добавить поставщика хранилища. Прочтите это: docs.microsoft. com/en-us/aspnet/core/security/authentication/   -  person Ruard van Elburg    schedule 11.08.2017


Ответы (1)


Identity Core имеет PasswordHasher Класс, который вы можете использовать. Просто в качестве примера вы можете сделать, как показано ниже:

//Initialize it
var _passwordHasher = new PasswordHasher<ApplicationUser>();

Найдите пользователя, которого хотите подтвердить:

var user = await _userManager.FindByNameAsync(request.Username);

Затем вы можете проверить пользователя, например:

if (user == null || _passwordHasher.VerifyHashedPassword(user, user.PasswordHash, request.Password) != PasswordVerificationResult.Success)            
{
return BadRequest();
}

Если он проходит этот раздел, вы можете сгенерировать токен:

var token = await GetJwtSecurityToken(user);

GetJwtSecurityToken() — это просто моя собственная функция с токеном генерации токена, но я понимаю, что вы уже сделали это со своей стороны.

Я не понимаю, почему SO не форматирует мой код.

person Felix Too    schedule 10.08.2017
comment
Он показывает, что ссылка на объект не установлена, ошибка в этой строке {System.Data.SqlClient.SqlException: Invalid column name 'NormalizedUserName' .. я думаю, что это связано с реализацией usermanager - person Sumit Singh; 10.08.2017