自定义AuthorizeAttribute OnAuthorizationAsync Function

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了自定义AuthorizeAttribute OnAuthorizationAsync Function相关的知识,希望对你有一定的参考价值。

我正在尝试制作自己的自定义System.Web.Http.AuthorizeAttribute。一切都工作,直到我需要在被覆盖的asyncfunction内运行一些OnAuthorization函数。

我找到了OnAuthorizationAsync方法,我使用它,但仍然有运行async方法的问题。我需要确保附加到HttpActionContext的标头位于数据库中。

    public override Task OnAuthorizationAsync(HttpActionContext actionContext, CancellationToken cancellationToken)
    {
        IEnumerable<string> values;
        if (actionContext.Request.Headers.TryGetValues("Authentication", out values))
        {
            var token = new Token() { TokenString = values.First() };
            if (await _tg.ValidateToken(token))
            {
                return base.OnAuthorizationAsync(actionContext, cancellationToken);
            }
        }

        base.HandleUnauthorizedRequest(actionContext);
    }

_tg.ValidateToken(token)是一种返回bool的async方法。如果我尝试await它并使OnAuthorizationAsync成为async方法,那么我显然无法返回任务:

由于OnAuthorizeAsync是一个返回'Task'的async方法,因此return关键字后面不能跟一个对象表达式。

有没有办法可以看出这个烂摊子?

答案

根据@ sellotape的回答:

public async override Task OnAuthorizationAsync(HttpActionContext actionContext, CancellationToken cancellationToken)
{
    IEnumerable<string> values;
    if (actionContext.Request.Headers.TryGetValues("Authentication", out values))
    {
        var token = new Token() { TokenString = values.First() };
        if (await _tg.ValidateToken(token))
        {
            return base.OnAuthorizationAsync(actionContext, cancellationToken);
        }
    }
    await base.HandleUnauthorizedRequest(actionContext);
}
另一答案

因为你使用await,你需要将async修饰符添加到方法的声明中。然后将你在那里的return改为await。编译器将完成剩下的工作 - 即为您返回Task

以上是关于自定义AuthorizeAttribute OnAuthorizationAsync Function的主要内容,如果未能解决你的问题,请参考以下文章

自定义AuthorizeAttribute

自定义AuthorizeAttribute OnAuthorizationAsync Function

ASP.NET Core 中如何通过 AuthorizeAttribute 做自定义验证?

IdentityServer4 - AuthorizeAttribute 不验证 JWT 令牌/自定义用户存储

如何让失败的 AuthorizeAttribute 返回 HTTP401?

MVC过滤器:自定义授权过滤器