混入 Odata 会弄乱自定义 System.Web.Http.AuthorizeAttribute

Mixing in Odata messes up custom System.Web.Http.AuthorizeAttribute

我们有一个 Web Api 应用程序已经运行了很长时间。

我们已经实现了我们自己的 System.Web.Http.AuthorizeAttribute 来初始化我们的用户状态和角色提供者,并且在 IsAuthorized() 的重载期间我们设置 HttpContext.Current.UserThread.CurrentPrincipal 到我们自己的 GenericPrincipal 用我们所有的东西初始化。

长期以来一直运行良好。

现在我们被要求建立一些 Odata api,所以我们从 git 中获取了 v6.15,并且它被拖到许多其他 dll 中(例如 newer/different mvc dll ) 改变了 System.Web.Http.AuthorizeAttribute 操作如何适应管道的行为。

现在,虽然我们的 [Authorize (Roles="OurFoo")] 正确授权,但 Thread.CurrentPrincipal 在我们真正进入我们的方法之前用其他东西得到 reset/swapped。这太棒了

[PrincipalPermission(SecurityAction.Demand, Role = "OurFoo")]

权限在我们的调用堆栈中降低。

有其他人 运行 参与其中并想出了正确的解决方法吗?

我找到了关于使用 System.Web.Mvc.AuthorizeAttribute 作为基础而不是 System.Web.Http.AuthorizeAttribute 的 Stack 文章,但是签名不同,不清楚这是否会对 Thread.CurrentPrincipal 得到重置问题。

不确定是否有人有更好的答案(除了告诉我 re-write 整个应用程序 "the new way"),但我找到了解决方法。

我将我们的身份验证逻辑从我们的 IsAuthorized() 函数中的授权中分离出来,并将其放在 MessageHandler 中,希望它能在管道中尽早得到处理,以便设置 Thread.CurrentPrincipal 能够持续存在。这似乎有效。