2017-09-23 2 views
2

J'essaie de comprendre .net injection de dépendance de base. Mon projet est actuellement une API Web, avec une authentification personnalisée. J'ai ajouté mon authentification comme si (dans Startups.cs sous « ConfigureServices »:Injection de dépendances C# - Authentification

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

Ma question est la suivante: Comment avez-vous accès IMemoryCache au sein du service d'authentification que j'ai essayé viens de créer une nouvelle MemoryCache et Le but principal est de vérifier les valeurs Nonce (voir si elles sont dans le cache, si yes auth échoue, sinon, ajouter au cache auth passes)

. est .NET Core 2 (API Web)

MISES à JOUR:

Voici la base de la classe HmacHandler (la partie qui fait la EFFECTIVEMENT auth):

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() 
{...} 
} 

Ensuite, il y a la classe « Options ».

public class HmacOptions : AuthenticationSchemeOptions 
{...} 

Il ne peut pas avoir de constructeur qui prend des paramètres. Je dois utiliser le IMemoryCache dans la classe HmacHandler. J'ai essayé d'y ajouter IMemoryCache (dans le constructeur, etc.). Cela n'a pas fonctionné.

+0

J'ai mis à jour la question avec quelques informations supplémentaires. Le IMemoryCache doit être accessible dans la méthode "HandleAuthenticateAsync()". Encore une fois, juste pour vérifier si un nonce particulier a été utilisé dans un laps de temps donné. – user3394319

+0

Aucune erreur. Le cache est toujours vide. Donc le nonce (disons pendant une attaque de réponse) n'est jamais trouvé dans le cache, donc il compte comme valide. Ce qui m'amène à croire que le cache est "nouveau" à chaque requête ... ce qui n'a pas de sens. Ou le cache de l'application n'est pas transmis correctement (ou quelque chose dans ce sens). – user3394319

+0

Dans Startup.cs sous ConfigureServices, j'appelle 'services.AddMemoryCache();' (avant que j'appelle app.UseAuthentication ....) – user3394319

Répondre

-1
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; 
    } 
} 
+0

Je n'ai pas réussi à faire marcher ça. Une partie de cela peut être le fait que je ne suis pas familier à 100% avec l'injection de dépendance/.net core 2.Ce sont donc les classes que j'ai dans le mécanisme d'authentification. je les HmacOptions héritant « AuthenticationSchemeOptions » (ce qui est là, je voulais, mais il ne peut faire des constructeurs sans paramètre. je le HmacHandler qui hérite « AuthenticationHandler ». Ces deux endroits ne semblent pas travailler J'ai également essayé d'ajouter un composant IMemoryCache au constructeur de HMacHandler – user3394319

+0

J'ai également essayé d'ajouter un composant IMemoryCache au constructeur de HMacHandler, avez-vous essayé de le faire comme singleton –

+0

que j'ai fait. 'services.AddSingleton ();' N'a pas fonctionné non plus :( – user3394319

0

vous devez définir IMemoryCache MemoryCache {get; ensemble; } public si vous souhaitez utiliser en dehors de la classe via l'injection de dépendance.

public IMemoryCache MemoryCache { get; set; } 
+0

Je l'ai passé au public et le même problème. ays vide. – user3394319

+0

Avez-vous vérifié pour confirmer que les éléments sont dans le cache? – crevenant

0

Donc la réponse a fini par être une combinaison de choses ici. Voici donc ce que je l'ai fait:

  1. Ajouter le "public" au IMemoryCache dans le HmacHandler
  2. Ajouté le IMemoryCache au constructeur de HmacHandler
  3. changé le get/set du cache de « TryGetValue/CreateEntry "à pur" Get/Set ".
+0

Le point n ° 1 n'aurait eu aucun impact: vous pourriez simplement avoir un 'readonly private IMemoryCache _memoryCache;' et obtenir le même résultat. –

+0

Bon à savoir pour l'avenir. – user3394319

0
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; 
    } 

Et puis à utiliser HandleAuthenticateAsync et ECRIRE de MemoryCache.