Проверьте, существует ли пользователь в ASP. NET Core WebAPI JWT Authentication - PullRequest
0 голосов
/ 22 апреля 2020

Я успешно настроил аутентификацию / авторизацию JWT в моем WebAPI, но есть одна проблема: я могу создать новую учетную запись пользователя, сгенерировать ее токен JWT, а затем удалить учетную запись, пока токен все еще действителен. Как и где я должен проверить, действительно ли существует пользователь, связанный с токеном, перед авторизацией?

Вот мой код для настройки JWT (Startup.cs):

var secretKey = Configuration.GetValue<string>("SecretKey");
            var symmetricKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(secretKey));

            services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme)
                .AddJwtBearer(options =>
                {
                    options.TokenValidationParameters = new TokenValidationParameters()
                    {
                        ValidateIssuer = true,
                        ValidateAudience = true,
                        ValidateIssuerSigningKey = true,

                        ValidIssuer = "localhost",
                        ValidAudience = "localhost",
                        IssuerSigningKey = symmetricKey
                    };
                });

Я использую атрибут [Authorize] на своих контроллерах, а идентификатор пользователя указан в токене JWT.

Заранее спасибо!

1 Ответ

2 голосов
/ 23 апреля 2020

Вы также можете проверить пользователя в AddJwtBearer событиях:

options.Events = new JwtBearerEvents()
{
    OnTokenValidated = context =>
    {
        //get userid if type is "userid"
        var userid = context.Principal.Claims.Where(x => x.Type == "userid").FirstOrDefault().Value;
        if (true )
        {
            context.Fail("invaild token");
        }
        return Task.CompletedTask;
    },

};

Если вы хотите проверить базу данных в этом событии, вы можете использовать зависимость для получения контекста БД, например:

var dbcontext = context.HttpContext.RequestServices.GetRequiredService<ApplicationDbContext>();
...