проверьте проверку пользователя в Asp.net ядро с авторизацией jwt

#c# #asp.net-core #asp.net-core-webapi

#asp.net #asp.net-web-api #asp.net-core #asp.net-identity #токен доступа

Вопрос:

Я внедрил Microsoft Identity и JWT в свой веб-API, клиент может войти в систему, получить токен JWT и сохранить его в приложении. с момента истечения срока действия токена пользователь может получить доступ к серверу, но если я удалю пользователя из своей базы данных, удаленный пользователь все еще имеет свой токен и может получить доступ к веб-api, как я могу проверить проверку пользователя?

Ответ №1:

Одним из вариантов является проверка текущего пользователя в событии JwtBearerEvent OnTokenValidated, которое будет запускаться после каждой успешной аутентификации

 services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme)
        .AddJwtBearer(options => {

        options.Events = new JwtBearerEvents
            {
                OnTokenValidated = context =>
                {
                    var userService = ServiceProvider.GetService<IUserService>();
                    if(userService.IsUserRemoved(context.Principal.Identity.Name))
                        context.Fail("User is removed");

                    return Task.CompletedTask;
                }
            };
        });
  

Примечание: В этом примере я использую ServiceProvider, чтобы получить экземпляр IUserService, который хранится в классе Startup.cs в качестве параметра. Инициализируется как ServiceProvider = services.BuildServiceProvider(); в методе ConfigureServices. IUserService — это класс-оболочка, в котором вам необходимо реализовать метод IsUserRemoved, который будет работать с вашей реализацией пользовательского провайдера.

Комментарии:

1. Я сделал, как вы сказали. но мой пользовательский сервис всегда равен нулю.

2. @MSjjD хорошо, вы зарегистрировали его в конфигурационных службах, подобных этим службам. AddTransient<IUserService, UserService>();

3. теперь это работает. спасибо 🙏. context.Principal. Идентификация. Имя возвращает значение null. Я использую context.Principal.Claims. Вместо этого First().Value. Я работаю. но я думаю, что это нехорошо.

4. @MSjjD отлично! Пожалуйста, примите / проголосуйте за ответ на этот ответ, если это помогло

5. Sry это была ошибка

Ответ №2:

Другой вариант — реализовать и зарегистрировать свой собственный SecurityTokenValidator . Для этого вам необходимо создать реализованный ISecurityTokenValidator интерфейс класса:

 //using Microsoft.IdentityModel.Tokens

public class CustomValidator : ISecurityTokenValidator
{
   //interface implementation
   ...
}
  

и зарегистрируйте его в качестве дополнительного средства проверки токенов через JwtBearerOptions.SecurityTokenValidators свойство:

 services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme)
    .AddJwtBearer( options => {

        options.SecurityTokenValidators.Add(new CustomValidator()) 
    });