Внедрение зависимостей 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 ответа
Таким образом, ответ оказался комбинацией вещей здесь. Итак, вот что я сделал:
- Добавьте "public" в IMemoryCache в HmacHandler
- Добавлен IMemoryCache в конструктор HmacHandler
- Изменено получение / установка кэша с "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;
}
}