我试图找出.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添加到它(在构造函数中等)。这没用。
答案 0 :(得分:0)
您需要设置IMemoryCache MemoryCache {get;组;如果你想通过依赖注入在类外部使用,那就公开了。
public IMemoryCache MemoryCache { get; set; }
答案 1 :(得分:0)
所以答案最终成了这里的组合。所以这就是我所做的:
答案 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;
}
}