C# 依赖注入 - 身份验证

C# Dependency Injection - Authentication

我正在尝试找出 .net 核心依赖注入。我的项目目前是一个网络 api,带有一些自定义身份验证。我已经像这样添加了我的身份验证(在 "ConfigureServices" 下的 Startups.cs:

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 值(查看它们是否在缓存中,如果是,则 auth 失败,如果不是,则添加到缓存 auth passes)。

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

更新:

这是 HmacHandler class 的基础(实际执行身份验证的部分):

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

然后是"Options"class。

public class HmacOptions : AuthenticationSchemeOptions
{...}

它不能有带参数的构造函数。我需要在 HmacHandler class 中使用 IMemoryCache。我尝试向其中添加 IMemoryCache(在构造函数等中)。那没有用。

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

您需要设置 IMemoryCache MemoryCache { get;放; } 到 public 如果你想通过依赖注入在 class 之外使用。

public IMemoryCache MemoryCache { get; set; }

所以答案最终是这里的事情的组合。所以这就是我所做的:

  1. 将"public"添加到HmacHandler中的IMemoryCache
  2. 在 HmacHandler 的构造函数中添加了 IMemoryCache
  3. 将缓存的 get/set 从 "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。