是否可以在MVC 4 AuthorizeAttribute中使用async / await?

时间:2014-05-15 22:15:33

标签: c# asp.net asp.net-mvc asp.net-mvc-4 async-await

我在MVC的AuthorizeAttribute上看到的唯一覆盖是public override void OnAuthorization( AuthorizationContext filterContext ),它不适合与async / await一起使用,因为它不返回Task。是否有另一种方法可以在MVC中创建允许使用async / await的AuthorizeAttribute

3 个答案:

答案 0 :(得分:21)

ASP.NET MVC今天不支持异步过滤器。 Please vote

然而,本周在TechEd上宣布的ASP.NET "vNext"将支持MVC的异步过滤器。

答案 1 :(得分:3)

随着asp.net核心的发布,Stephen Cleary的答案是正确的,如果你运行的是最新的asp.net核心,这是理想的方式。

对于那些尚未更新的人,我能够使用异步HttpModule解决我的问题,该异步HttpModule通过HttpContext.Items将状态传递给AuthorizationFilter。我在此处添加了有关我的解决方案的更多详细信息 - http://evandontje.com/2017/08/15/solutions-for-async-await-in-mvc-action-filters/

答案 2 :(得分:1)

对于那些还没有对.net核心感到高兴的人,但是你可以在ASP.NET Web API 2中使用这个方法:

OnAuthorizationAsync override:

public override async Task OnAuthorizationAsync(HttpActionContext actionContext, CancellationToken cancellation)

例如,您可以像这样调用异步 webapi服务:

 public override async Task OnAuthorizationAsync(HttpActionContext actionContext, CancellationToken cancellation)
    {
        await base.OnAuthorizationAsync(actionContext, cancellation);

        if (await IsUserAdminAsync()) /* call any async service */
            return;
        this.HandleUnauthorizedRequest(actionContext);
    }