在 AuthorizationHandler 中使用 `await`

Bel*_*way 4 c# asp.net-authorization async-await .net-core

我有一个 AuthorizationHandler ,它依赖于为 .NET Core 3.1 的授权中间件提供异步方法的服务。我在方法内部调用了其中一些异步方法HandleRequirementAsync。整体代码如下所示:

{
    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 { }
}
Run Code Online (Sandbox Code Playgroud)

不过,一旦我使用await语句,我就会收到一个错误,表明签名未明确设置为异步。添加async到继承方法的签名会导致以下错误。 a return keyword must not be followed by an object expression. Did you intend to return 'Task<T>'?

线程详细阐述了类似的问题,但该解决方案似乎不适用于 .NET Core 3.1。

按以下方式使用 Result 是可行的,但据我所知这将导致阻塞调用:

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

我不确定这里正确的解决方案是什么样的。

Pau*_*ado 6

async如果您的方法的返回类型是Task,那么,除了await关键字之外,您还可以将您的方法视为正在void返回:

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