Внедрение зависимостей C# - аутентификация

Я пытаюсь выяснить.net ядро ​​инъекции зависимостей. Мой проект в настоящее время веб-API с некоторой пользовательской аутентификацией. Я добавил свою аутентификацию следующим образом (в Startups.cs в разделе "ConfigureServices":

services.AddAuthentication(Authentication.Hmac.HmacDefaults.AuthenticationScheme).AddHmac(options =>
                {
                    options.AuthName = "myname";
                    options.CipherStrength = HmacCipherStrength.Hmac256;
                    options.EnableNonce = true;
                    options.RequestTimeLimit = 5;
                    options.PrivateKey = "myprivatekey";
                });

У меня такой вопрос: как вы получаете доступ к IMemoryCache в службе аутентификации? Я попытался только что создал новый MemoryCache и передать его, но это не работает. Основная цель - проверка значений Nonce (посмотрите, есть ли они в кеше, если да, аутентификация не удалась, если нет, добавьте в проходы аутентификации кэша).

Опять же, это.NET Core 2 (веб-API).

ОБНОВЛЕНИЕ:

Вот основа класса HmacHandler (часть, которая фактически выполняет аутентификацию):

public class HmacHandler : AuthenticationHandler<HmacOptions>
{
private static string Signature;
private static string Nonce;
private static Encoding Encoder { get { return Encoding.UTF8; } set { } }

IMemoryCache MemoryCache { get; set; }

public HmacHandler(IOptionsMonitor<HmacOptions> options, ILoggerFactory logger, UrlEncoder encoder, IDataProtectionProvider dataProtection, ISystemClock clock)
: base(options, logger, encoder, clock)
{
}

protected override async Task<AuthenticateResult> HandleAuthenticateAsync()
{...}
}

Тогда есть класс "Опции".

public class HmacOptions : AuthenticationSchemeOptions
{...}

У него не может быть конструктора, который принимает параметры. Мне нужно использовать IMemoryCache в классе HmacHandler. Я попытался добавить IMemoryCache к нему (в конструкторе и т. Д.). Это не сработало.

4 ответа

Таким образом, ответ оказался комбинацией вещей здесь. Итак, вот что я сделал:

  1. Добавьте "public" в IMemoryCache в HmacHandler
  2. Добавлен IMemoryCache в конструктор HmacHandler
  3. Изменено получение / установка кэша с "TryGetValue/CreateEntry" на чистый "Get/Set".
    private IMemoryCache memoryCache { get; set; }

    public HmacAuthenticationHandler(IOptionsMonitor<HmacAuthenticationOptions> options, ILoggerFactory logger, UrlEncoder encoder, ISystemClock clock, IMemoryCache memCache)
        : base(options, logger, encoder, clock)
    {
        memoryCache = memCache;
    }

А затем в HandleAuthenticateAsync используйте Get и Set of memoryCache.

Вам необходимо установить IMemoryCache MemoryCache { get; задавать; } public, если вы хотите использовать вне класса через внедрение зависимостей.

public IMemoryCache MemoryCache { get; set; }
    public void ConfigureServices(IServiceCollection services)
    {                        

        services.AddMemoryCache();
services.AddAuthentication(Authentication.Hmac.HmacDefaults.AuthenticationScheme).AddHmac(options =>
                {
                    options.AuthName = "myname";
                    options.CipherStrength = HmacCipherStrength.Hmac256;
                    options.EnableNonce = true;
                    options.RequestTimeLimit = 5;
                    options.PrivateKey = "myprivatekey";
                    // do your stuff with Test class here
                });

    }
public class Test {
  private IMemoryCache _cache;
  public Test(IMemoryCache cache) {
    _cache = cache;
  }
}
Другие вопросы по тегам