C#依赖注入 - 身份验证

时间:2017-09-23 18:33:08

标签: c# web asp.net-core-2.0 memorycache

我试图找出.net核心依赖注入。我的项目目前是一个web api,带有一些自定义身份验证。我已经添加了我的身份验证(在" StartServices"在

下的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传递)。

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

更新

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

然后是&#34;选项&#34;类。

public class HmacOptions : AuthenticationSchemeOptions
{...}

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

4 个答案:

答案 0 :(得分:0)

您需要设置IMemoryCache MemoryCache {get;组;如果你想通过依赖注入在类外部使用,那就公开了。

public IMemoryCache MemoryCache { get; set; }

答案 1 :(得分:0)

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

  1. 添加&#34; public&#34;到HmacHandler中的IMemoryCache
  2. 将IMemoryCache添加到HmacHandler的构造函数
  3. 从&#34; TryGetValue / CreateEntry&#34;更改了缓存的获取/设置纯粹的&#34;获取/设置&#34;。

答案 2 :(得分: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和Set of memoryCache。

答案 3 :(得分:-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;
  }
}