GOOGLE ADS

domingo, 1 de mayo de 2022

Usando `await` en AuthorizationHandler

Tengo un AuthorizationHandler que depende de un servicio que ofrece métodos asincrónicos para el middleware de autorización de.NET Core 3.1. Tengo que llamar a algunos de estos métodos asíncronos dentro del HandleRequirementAsyncmétodo. El código general se ve así:

{
public class MyAuthorizationHandler: AuthorizationHandler<MyRequirement, Tuple<string, string>>
{
private readonly IAuthIntelRepository authIntelRepository;
public UserAssistanceAuthorizationHandler(IAuthIntelRepository authIntelRepository)
{
this.authIntelRepository = authIntelRepository;
}
protected override Task HandleRequirementAsync(AuthorizationHandlerContext context, MyRequirement requirement, Tuple<string, string> someRessource)
{
//some async calls to authIntelRepository
if (/*someCondition*/false)
{
context.Succeed(requirement);
}
return Task.CompletedTask;
}
}
public class MyRequirement: IAuthorizationRequirement { }
}

Sin embargo, tan pronto como uso una awaitdeclaración, aparece un error de que la firma no está configurada explícitamente como asíncrona. Agregar asynca la firma del método heredado provoca el siguiente error.
a return keyword must not be followed by an object expression. Did you intend to return 'Task<T>'?

Este hilo elabora un problema similar, pero la solución no parece funcionar en.NET Core 3.1.

Usar Result de la siguiente manera funciona, pero AFAIK esto resultará en una llamada de bloqueo:

Task<Object> obj= this.authIntelRepository.getSomeAsync(...);
obj.Result.property //do Something to check the requirement

No estoy seguro de cómo sería la solución correcta aquí.


Solución del problema

Si el tipo de devolución de su asyncmétodo es Task, entonces, además de la awaitpalabra clave, trata su método como si estuviera voidregresando:

protected override async Task HandleRequirementAsync(AuthorizationHandlerContext context, MyRequirement requirement, Tuple<string, string> someRessource)
{
await authIntelRepository....
if (/*someCondition*/false)
{
context.Succeed(requirement);
}
return;
}

No hay comentarios:

Publicar un comentario

Regla de Firestore para acceder a la generación de subcolección Permisos faltantes o insuficientes

Tengo problemas con las reglas de Firestore para permitir el acceso a algunos recursos en una subcolección. Tengo algunos requests document...