Na maioria das minhas APIs, eu simplesmente faço uma autorização como esta:
[Authorize(Policy = "Foo")]
public MyApi()
Eu recebo essa política de um NuGet e não consigo modificá-la.
Para algumas das minhas APIs, nem sempre quero ter essa política. Isso precisa ser resolvido em tempo de execução com base em algumas configurações. Eu gostaria de alguma maneira de executar isso em linha e garantir que todos os manipuladores que estão configurados sejam executados.
Depois de muita pesquisa, descobri que crio um IAuthorizationService
e utilizo isso para chamar AuthorizeAsync
. Parece que é isso que eu quero, mas o problema que estou enfrentando agora é que todos os manipuladores dependem de AuthorizationFilterContext
como recurso no contexto. Isso parece acontecer automaticamente quando a Autorização é feita através do atributo, mas não através da chamada para AuthorizeAsync. Ele precisa ser passado manualmente neste caso. Meu código agora está assim:
public MyApi()
{
var allowed = await _authorizationService.AuthorizeAsync(User, null, "Foo").ConfigureAwait(false);
}
Isso parece passar por todos os meus manipuladores corretamente, mas eles não funcionam devido à falta do AuthorizationFilterContext
.
1) Essa é a abordagem correta para começar, ou existe alguma outra maneira de fazer isso em linha? Eu estou supondo que provavelmente haja alguma maneira de criar minha própria política que envolva esta e eu possa verificar a configuração lá, mas se houver uma abordagem simples em linha, eu preferiria isso.
2) Se esse caminho for válido, existe uma boa maneira de obter o AuthorizationFilterContext
? Tentei criá-lo manualmente, mas receio que isso não esteja correto sem passar mais dados do contexto, mas não consigo encontrar bons exemplos / doc:
new AuthorizationFilterContext(new ActionContext(HttpContext, HttpContext.GetRouteData(), new ActionDescriptor()), new IFilterMetadata[] { });