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; }
所以答案最终是这里的事情的组合。所以这就是我所做的:
- 将"public"添加到HmacHandler中的IMemoryCache
- 在 HmacHandler 的构造函数中添加了 IMemoryCache
- 将缓存的 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。
我正在尝试找出 .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; }
所以答案最终是这里的事情的组合。所以这就是我所做的:
- 将"public"添加到HmacHandler中的IMemoryCache
- 在 HmacHandler 的构造函数中添加了 IMemoryCache
- 将缓存的 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。