Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Using `await` in AuthorizationHandler

I have a AuthorizationHandler depending on a Service offering async methods for .NET Core 3.1's Authorization Middleware. I have o call some of these async methods inside the HandleRequirementAsync method. The overall code looks like this:

{
    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 { }
}

As soon is I use an await statement though, I get an error that the signature isn't explicitly set as async. Adding async to the inherited method's signature causes the following error. a return keyword must not be followed by an object expression. Did you intend to return 'Task<T>'?

This thread elaborates a similar issue but the solution doesn't seem to work in .NET Core 3.1.

Using Result in the following manner works, but AFAIK this will result in a blocking call:

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

I'm not sure what the correct solution would look like here.

like image 856
Beltway Avatar asked Oct 21 '25 14:10

Beltway


1 Answers

If the return type of your async method is Task, then, apart from the await keyword, your treat your method as if it was void returning:

protected override async Task HandleRequirementAsync(AuthorizationHandlerContext context, MyRequirement requirement, Tuple<string, string> someRessource)
{
    await authIntelRepository....
    if (/*someCondition*/false)
    {
         context.Succeed(requirement);
     }
     return;
}
like image 79
Paulo Morgado Avatar answered Oct 23 '25 05:10

Paulo Morgado



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!