是否可以在MVC 4 AuthorizeAttribute中使用async / await?
我在MVC的AuthorizeAttribute
上看到的唯一覆盖是public override void OnAuthorization( AuthorizationContext filterContext )
,它不适合与async / await一起使用,因为它不返回Task
。 是否有另一种方法可以在MVC中创建允许使用async / await的AuthorizeAttribute
?
ASP.NET MVC今天不支持异步filter。 请投票 。
但是,本周在TechEd上宣布的ASP.NET“vNext”将支持MVC的异步filter。
随着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/
对于那些还没有对.net核心感到高兴的人,你可以在ASP.NET Web API 2中使用这个方法:
OnAuthorizationAsync覆盖:
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); }