Я хотел бы вызвать метод интерфейса для дополнительной проверки токена JWT. Итак, я реализовал собственный валидатор, расширив интерфейс ISecurityTokenValidator следующим образом, и попытался внедрить IServiceProvider для вызова метода AuthService GetUsername. Здесь моя проблема заключается в том, как инициализировать класс с внедрением зависимостей в builder.Services.AddJwtBearer при запуске
Платформа и проект: .NET 7 — веб-API
Обработчик токенов JWT
public class MyJwtSecurityTokenHandler : ISecurityTokenValidator
{
private int _maxTokenSizeInBytes = TokenValidationParameters.DefaultMaximumTokenSizeInBytes;
private readonly JwtSecurityTokenHandler _tokenHandler;
private IServiceProvider _serviceProvider;
public MyJwtSecurityTokenHandler(IServiceProvider serviceProvider)
{
_tokenHandler = new JwtSecurityTokenHandler();
_serviceProvider = serviceProvider;
}
public int MaximumTokenSizeInBytes
{
get { return _maxTokenSizeInBytes; }
set { _maxTokenSizeInBytes = value; }
}
bool ISecurityTokenValidator.CanValidateToken => throw new NotImplementedException();
public bool CanReadToken(string securityToken)
{
return _tokenHandler.CanReadToken(securityToken);
}
ClaimsPrincipal ISecurityTokenValidator.ValidateToken(string securityToken, TokenValidationParameters validationParameters, out SecurityToken validatedToken)
{
try
{
// Set up validation parameters or do extra checks
using (var scope = _serviceProvider.CreateScope())
{
var username = scope.ServiceProvider.GetRequiredService<IAuthService>().GetUsername(securityToken);
}
return _tokenHandler.ValidateToken(securityToken, validationParameters, out validatedToken);
}
catch (Exception ex)
{
validatedToken = null;
return null;
}
}
}
Запускать
MyJwtSecurityTokenHandler mytokenValidator = new();
builder.Services.AddAuthentication(options =>
{
options.DefaultAuthenticateScheme = JwtBearerDefaults.AuthenticationScheme;
options.DefaultChallengeScheme = JwtBearerDefaults.AuthenticationScheme;
}).AddJwtBearer(options =>
{
options.RequireHttpsMetadata = true;
options.SaveToken = true;
options.TokenValidationParameters = new TokenValidationParameters()
{
ValidateIssuerSigningKey = true,
IssuerSigningKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes("custom validation key")),
ValidateIssuer = false,
ValidateAudience = true,
};
options.SecurityTokenValidators.Clear();
options.SecurityTokenValidators.Add(mytokenValidator);
});
Я пытался использовать множество руководств, но нет надлежащей информации о том, как инициализировать mytokenValidator с внедрением зависимостей в Startup
OAuthService должен быть зарегистрирован как область действия, а не как синглтон?
@RuikaiFeng - Да, IAuthService зарегистрирован как services.AddScoped<IAuthService, AuthService> - Пожалуйста, дайте мне знать, что делать, если я ошибаюсь.
Я получил ответ в OpenGPT. Действительно потрясающе и удивительно... Предлагаемое решение OpenGPT работает на 100% без ошибок. ИИ — это новый мир, в котором нужно практиковаться в том, как путешествовать с ИИ, чтобы упростить нашу работу.
Надеюсь, это поможет stackoverflow.com/questions/46962770/…