En la mayoría de mis API, simplemente hago una autorización como esta:
[Authorize(Policy = "Foo")]
public MyApi()
Sin embargo, obtengo esta política de un NuGet y no puedo modificarla.
Para algunas de mis API, no siempre quiero tener esta política. Esto necesita ser resuelto en tiempo de ejecución basado en alguna configuración. Me gustaría alguna forma de ejecutar esto en línea y asegurarme de que se ejecuten todos los controladores que están configurados.
Después de muchas búsquedas, descubrí que creo un IAuthorizationService
y lo uso para llamar AuthorizeAsync
. Parece que es lo que quiero, pero el problema con el que me encuentro ahora es que todos los controladores dependen de un AuthorizationFilterContext
recurso como contexto. Esto parece suceder automáticamente cuando la Autorización se realiza a través del atributo, pero no a través de la llamada a AuthorizeAsync. Debe pasarse manualmente en este caso. Mi código ahora se ve así:
public MyApi()
{
var allowed = await _authorizationService.AuthorizeAsync(User, null, "Foo").ConfigureAwait(false);
}
Esto parece pasar por todos mis controladores correctamente, pero no funcionan debido a que faltan AuthorizationFilterContext
.
1) ¿Es este el enfoque correcto para empezar, o hay alguna otra forma de hacerlo en línea? Supongo que probablemente haya alguna forma de crear mi propia política que envuelva esta y puedo verificar la configuración allí, pero si hay un enfoque simple en línea, preferiría eso.
2) Si esta forma es válida, ¿hay una buena manera de obtenerla AuthorizationFilterContext
? He intentado crearlo manualmente, pero me temo que esto no es correcto sin pasar más datos del contexto, pero no puedo encontrar ningún buen ejemplo / documento:
new AuthorizationFilterContext(new ActionContext(HttpContext, HttpContext.GetRouteData(), new ActionDescriptor()), new IFilterMetadata[] { });