В большинстве моих API я просто делаю авторизацию следующим образом:
[Authorize(Policy = "Foo")]
public MyApi()
Я получаю эту политику из NuGet и не могу ее изменить.
Для некоторых моих API я не всегда хочу иметь эту политику. Это нужно выяснить во время выполнения, основываясь на некоторой конфигурации. Я хотел бы как-нибудь запустить этот in-line и убедиться, что все обработчики, которые запускаются при установке, запускаются.
После долгих поисков я обнаружил, что создаю IAuthorizationService
и использую его для звоните AuthorizeAsync
. Кажется, это то, что я хочу, но проблема, с которой я сейчас сталкиваюсь, заключается в том, что все обработчики полагаются на AuthorizationFilterContext
в качестве ресурса в контексте. Кажется, это происходит автоматически, когда авторизация выполняется через атрибут, а не через вызов AuthorizeAsyn c. В этом случае его необходимо передать вручную. Мой код сейчас выглядит следующим образом:
public MyApi()
{
var allowed = await _authorizationService.AuthorizeAsync(User, null, "Foo").ConfigureAwait(false);
}
Кажется, что go корректно проходит через все мои обработчики, но они не работают из-за отсутствия AuthorizationFilterContext
.
1) Это правильный подход для начала, или есть какой-то другой способ сделать это in-line? Я предполагаю, что, возможно, есть какой-то способ создать мою собственную политику, которая обернет это, и я могу проверить конфигурацию там, но если есть простой встроенный подход, я бы предпочел это.
2) Если это способ действителен, есть ли хороший способ получить AuthorizationFilterContext
? Я пытался создать его вручную, но боюсь, что это на самом деле не правильно без передачи большего количества данных из контекста, но я не могу найти хороших примеров / do c:
new AuthorizationFilterContext(new ActionContext(HttpContext, HttpContext.GetRouteData(), new ActionDescriptor()), new IFilterMetadata[] { });