2017-09-23 80 views
2

我想弄清楚.net核心依赖注入。我的项目目前是一个web api,有一些自定义认证。C#依赖注入 - 身份验证

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

我的问题是这样的:我已经在“ConfigureServices补充说:”我的认证,像这样(在Startups.cs?你如何认证服务中访问IMemoryCache我已经试过刚刚创建了一个新的MemoryCache和在路过它,但这是行不通的。其主要目的是用于检查随机数的值(,看看他们是否在缓存中,如果是身份验证失败,如果没有,添加到高速缓存AUTH单程)。

同样,这是.NET Core 2(Web API)。

更新:

这里是HmacHandler类的基础(实际执行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() 
{...} 
} 

然后是“选项”类。

public class HmacOptions : AuthenticationSchemeOptions 
{...} 

它不能有一个带参数的构造函数。我需要在HmacHandler类中使用IMemoryCache。我尝试添加IMemoryCache(在构造函数等)。这没有用。

+0

我用更多的信息更新了这个问题。需要在“HandleAuthenticateAsync()”方法中访问IMemoryCache。再次,只是为了检查在给定的时间内是否使用了特定的随机数。 – user3394319

+0

没有错误。缓存总是空的。因此,在缓存中永远不会发现随机数(在回复攻击期间),因此它算作有效。这导致我相信,无论是缓存对于每个请求都是“新的”,这是没有意义的。或者应用程序缓存没有正确传入(或沿着这些线)。 – user3394319

+0

在ConfigureServices下的Startup.cs中调用'services.AddMemoryCache();'(在我调用app.UseAuthentication ....之前) – user3394319

回答

-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

我一直没能得到那个工作。其中一部分可能是我并不是100%熟悉依赖注入/ .net core 2。所以这些是我在认证机制内部的类。 我有继承“AuthenticationSchemeOptions”(这是我本来想它,但它只能做参数构造函数。 我它继承“的AuthenticationHandler ”的HmacHandler。这两个地方似乎已经不上班HmacOptions 。我也尝试在HMacHandler的构造函数中添加一个IMemoryCache组件。 – user3394319

+0

我也尝试在HMacHandler的构造函数中添加一个IMemoryCache组件。你是否试图像我做的单身人士 –

+0

那样做。我试过用单身人士调用它 'services.AddSingleton ();' 也没有工作:( – user3394319

0

您需要设置IMemoryCache MemoryCache {get;组; }如果您想通过依赖注入在课程外部使用,请将其公诸于众。

public IMemoryCache MemoryCache { get; set; } 
+0

我把它切换到公共和同一问题。缓存是ALW ays空了。 – user3394319

+0

您是否检查确认物品正在进入缓存? – crevenant

0

所以最终的答案是这里的一个组合。因此,这里是我做过什么:

  1. 在HmacHandler
  2. 添加了IMemoryCache添加“公共”的IMemoryCache到HmacHandler
  3. 的构造改变了get/set缓存从“TryGetValue/CreateEntry“为纯粹的”Get/Set“。
+0

点#1不会产生任何影响:您可以简单地拥有一个“private readonly IMemoryCache _memoryCache;”并获得相同的结果。 –

+0

很高兴认识未来。 – 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; 
    } 

然后在HandleAuthenticateAsync使用Get和的MemoryCache集。