global.asax.cs授权webapi需要锁定的事件?

时间:2017-05-24 13:11:55

标签: c# authentication asp.net-web-api authorization global-asax

我正在开发一个web api,每个请求都通过授权注释方法进行身份验证,即[授权(角色="交易者")]

根据日志我可以告诉多个请求同时进入Application_PostAcquireRequestState事件。

当在Application_PostAcquireRequestState事件中加载角色时,可能存在竞争条件,并且某些调用会随机失败。

我不确定自己是否走上正轨。该事件是应用程序级别,Application.Lock()可以解决问题,并想知道它是否是正确的解决方案。 我注意到几次对web api的调用失败,这些调用同时发生。

感谢您的帮助。

Global.ascs.cs

 protected void Application_PostAcquireRequestState()
 {
//Application.Lock();
//get user roles and verify access...
...
//Application.Unlock();
}

controller.cs

[Authorize(Roles = "Trader")]
public async Task<IHttpActionResult> GetOrder(long id)
{
    //get order
}

1 个答案:

答案 0 :(得分:1)

你错了,这个事件,以及其他一些事件(BeginRequest,AuthenticateRequest,AcquireRequestState等)在技术上是一个应用程序级事件(Application_...),但实际上它是一个请求级别对于不同的请求,会同时触发事件和同一处理程序的多个副本。

这意味着处理程序的sender参数为您提供了精确的执行上下文,并且可以像

一样使用
protected void Application_PostAcquireRequestState( object sender, EventArgs e )
{
    HttpApplication app = (HttpApplication)sender;
    HttpContext ctx = app.Context; // current context

    // with the current context in hand you can pretty much access anything
    // including the Request, Response and last but not least, User
}

无需锁定或任何其他节流方式。

我只是不确定为什么你会在这里验证访问权限,考虑到MVC / WebAPI将在管道中根据你放在Authorize和角色的那一刻进行访问。