Внедрение IOptions <> в ApiKeyAuthorizeAttribute - PullRequest
1 голос
/ 18 апреля 2019

Я использую шаблон параметров, в котором хранятся различные конфигурации, в том числе ключи API для различных сред. До сих пор я использовал это нормально и вводил свои значения в классы по мере необходимости.

Однако я столкнулся с небольшой проблемой, пытаясь настроить авторизацию в контроллере и выполнить проверку для моего ApiKey, уникального для среды, потому что я не смог внедрить IOptions в класс ApiKeyAuthorizeAttribute для выполнения проверки.

Вот как теперь выглядит мой контроллер:

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

ApiKeyAuthorize Класс:

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

Моя проблема в том, что инъекция здесь невозможна, но мне нужно получить значение из IOptions <> для запуска проверки ApiKey.

1 Ответ

1 голос
/ 18 апреля 2019

Атрибуты создаются на месте, поэтому невозможно вставить в них зависимости.Тем не менее, ASP.NET Core предоставляет обходной путь.Вместо непосредственного применения атрибута вы можете использовать вместо него атрибут ServiceFilter и передать ему тип фильтра, который вы хотите применить:

[ServiceFilter(typeof(ApiAuthorizeAttribute))]

Это будет динамически применять фильтр к контроллеру / действию, покасоздание экземпляра с любыми зависимостями, которые требуются одновременно.Тем не менее, это ограничивает вас в другом направлении.Например, если вам нужно сделать что-то вроде:

[ApiAuthorizeAttribute(Roles = "Admin")]

Невозможно достичь этого с помощью атрибута ServiceFilter, потому что вы не можете передавать значения свойств, такие как Roles здесь, вместе стип.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...