#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())
});