asp.net 自定义AuthorizeAttribute OnAuthorizationAsync函数

np8igboo  于 2023-04-22  发布在  .NET
关注(0)|答案(2)|浏览(227)

我正在尝试创建自己的自定义System.Web.Http.AuthorizeAttribute。在我需要在被覆盖的OnAuthorization函数中运行一些async函数之前,一切都正常。
我找到了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方法,那么显然我不能返回Task:
由于OnAuthorizeAsync是一个返回'Task'的async方法,因此return关键字后面不能跟对象表达式。
有没有什么办法能让你看清这一团乱麻?

ui7jx7zq

ui7jx7zq1#

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

zf2sa74q

zf2sa74q2#

根据@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 await base.OnAuthorizationAsync(actionContext, cancellationToken);
        }
    }
    await base.HandleUnauthorizedRequest(actionContext);
}

相关问题