【问题标题】:Custom AuthorizeAttribute OnAuthorizationAsync Function自定义 AuthorizeAttribute OnAuthorizationAsync 函数
【发布时间】:2017-04-18 01:43:33
【问题描述】:

我正在尝试制作自己的自定义 System.Web.Http.AuthorizeAttribute。一切正常,直到我需要在覆盖的 OnAuthorizationfunction 中运行一些 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) 是一个返回布尔值的async 方法。如果我尝试await 并让OnAuthorizationAsync 成为async 方法,那么我显然无法返回任务:

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

有什么办法可以让你从这个混乱中看出来吗?

【问题讨论】:

    标签: c# asp.net asp.net-web-api async-await


    【解决方案1】:

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

    【讨论】:

    • @Nick H,如果它适合你,应该将此答案标记为有效
    【解决方案2】:

    基于@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 base.OnAuthorizationAsync,而不是返回它。不要只传递Task
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-09-22
    • 2020-09-08
    • 1970-01-01
    • 2014-12-23
    • 2012-03-17
    相关资源
    最近更新 更多