Как добавить внедрение зависимостей в ISecurityTokenValidator из AddJwtBearer в .net C# Web API

Я хотел бы вызвать метод интерфейса для дополнительной проверки токена 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

Надеюсь, это поможет stackoverflow.com/questions/46962770/…

E. Shcherbo 14.02.2023 06:15

OAuthService должен быть зарегистрирован как область действия, а не как синглтон?

Ruikai Feng 14.02.2023 10:46

@RuikaiFeng - Да, IAuthService зарегистрирован как services.AddScoped<IAuthService, AuthService> - Пожалуйста, дайте мне знать, что делать, если я ошибаюсь.

B.Balamanigandan 14.02.2023 13:09
Ускорьте разработку веб-приложений Laravel с помощью этих бесплатных стартовых наборов
Ускорьте разработку веб-приложений Laravel с помощью этих бесплатных стартовых наборов
Laravel - это мощный PHP-фреймворк, используемый для создания масштабируемых и надежных веб-приложений. Одним из преимуществ Laravel является его...
Что такое двойные вопросительные знаки (??) в JavaScript?
Что такое двойные вопросительные знаки (??) в JavaScript?
Как безопасно обрабатывать неопределенные и нулевые значения в коде с помощью Nullish Coalescing
Создание ресурсов API Laravel: Советы по производительности и масштабируемости
Создание ресурсов API Laravel: Советы по производительности и масштабируемости
Создание API-ресурса Laravel может быть непростой задачей. Она требует глубокого понимания возможностей Laravel и лучших практик, чтобы обеспечить...
Как сделать компонент справочного центра с помощью TailwindCSS
Как сделать компонент справочного центра с помощью TailwindCSS
Справочный центр - это веб-сайт, где клиенты могут найти ответы на свои вопросы и решения своих проблем. Созданный для решения многих распространенных...
Асинхронная передача данных с помощью sendBeacon в JavaScript
Асинхронная передача данных с помощью sendBeacon в JavaScript
В современных веб-приложениях отправка данных из JavaScript на стороне клиента на сервер является распространенной задачей. Одним из популярных...
Как подобрать выигрышные акции с помощью анализа и визуализации на Python
Как подобрать выигрышные акции с помощью анализа и визуализации на Python
Отказ от ответственности: Эта статья предназначена только для демонстрации и не должна использоваться в качестве инвестиционного совета.
0
3
61
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Я получил ответ в OpenGPT. Действительно потрясающе и удивительно... Предлагаемое решение OpenGPT работает на 100% без ошибок. ИИ — это новый мир, в котором нужно практиковаться в том, как путешествовать с ИИ, чтобы упростить нашу работу.

Другие вопросы по теме

Похожие вопросы