Asp.net core 注射眼压<&燃气轮机;进入APIKEY属性

Asp.net core 注射眼压<&燃气轮机;进入APIKEY属性,asp.net-core,dependency-injection,authorization,asp.net-core-webapi,Asp.net Core,Dependency Injection,Authorization,Asp.net Core Webapi,我使用的选项模式存储不同的配置,包括不同环境的API键。到目前为止,我一直在很好地使用它,并根据需要将我的值注入到类中 但是,在尝试在控制器中设置授权并对每个环境唯一的ApiKey运行验证时,我遇到了一个小挑战,因为我无法将IOOptions注入ApiKeyAuthorizationAttribute类以执行验证 下面是我的控制器现在的样子: [ApiKeyAuthorize] public class NotificationSettingsController : Controller {

我使用的选项模式存储不同的配置,包括不同环境的API键。到目前为止,我一直在很好地使用它,并根据需要将我的值注入到类中

但是,在尝试在控制器中设置授权并对每个环境唯一的ApiKey运行验证时,我遇到了一个小挑战,因为我无法将IOOptions注入ApiKeyAuthorizationAttribute类以执行验证

下面是我的控制器现在的样子:

[ApiKeyAuthorize]
public class NotificationSettingsController : Controller
{
    //some endpoints here
}
APIkeyAuthorization类:

public class ApiKeyAuthorizeAttribute : Attribute, IAuthorizationFilter
{
    //////This...
    private readonly IOptions<MyConfig> _config;

    public ApiKeyAuthorizeAttribute(IOptions<MyConfig> config)
    {
        _config = config;
    }
    /////////...is what I am trying to accomplish
    public void OnAuthorization(AuthorizationFilterContext context)
    {
        var request = context.HttpContext.Request;

        var foundApiKeys = request.Headers.TryGetValue("ReplaceWithOptionsApiKeyName", out var requestApiKeys);

        if (!foundApiKeys || requestApiKeys[0] != "ReplaceWithOptionsApiKeyValue")
        {
            context.Result = new UnauthorizedResult();
        }
    }
}
public类ApiKeyAuthorizeAttribute:属性,IAAuthorizationFilter
{
//////这个。。。
私有只读IOptions\u config;
公共ApiKeyAuthorizeAttribute(IOptions配置)
{
_config=config;
}
/////////…这就是我想要实现的
授权时的公共无效(AuthorizationFilterContext上下文)
{
var request=context.HttpContext.request;
var foundapikees=request.Headers.TryGetValue(“ReplaceWithOptionsApiKeyName”,out var requestapikees);
如果(!FoundApikees | | RequestApikees[0]!=“ReplaceWithOptions ApikeyValue”)
{
context.Result=新的UnauthorizedResult();
}
}
}

我的问题是这里不可能注入,但我需要从IOptions获取一个值来运行ApiKey验证。

属性是在适当的位置构造的,因此不可能将依赖项注入到它们中。但是,ASP.NET Core提供了一种变通方法。您可以使用
ServiceFilter
属性并将要应用的筛选器类型传递给它,而不是直接应用该属性:

[ServiceFilter(typeof(ApiAuthorizeAttribute))]
这将动态地将过滤器应用于控制器/操作,同时使用所需的任何依赖项对其进行实例化。然而,它确实在另一个方向上限制了你。例如,如果您需要执行以下操作:

[ApiAuthorizeAttribute(Roles = "Admin")]

使用
ServiceFilter
属性不可能实现这一点,因为您不能在这里传递属性值,例如
Roles
,以及类型。

对于将来搜索此问题的人来说,次要详细信息:不要忘了在Startup.cs中添加
services.AddScoped()
,否则就是完美的解决方案!