混合使用Odata搞定自定义System.Web.Http.AuthorizeAttribute

时间:2017-01-25 21:54:40

标签: asp.net-mvc odata authorize-attribute

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

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

很长一段时间以来一直很好。

现在我们已经被要求站起来一些Odata apis,所以我们从git中获取v6.15,并且它被拖动了很多其他dll(例如更新/不同的mvc dll),它们改变了行为的方式System.Web.Http.AuthorizeAttribute行动适合管道。

现在,当我们的[Authorize (Roles="OurFoo")]正确授权时,Thread.CurrentPrincipal会在我们实际进入我们的方法之前与其他东西重置/换出。那是打破

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

权限在我们的callstack中降低。

还有其他人遇到过这个并找到了正确的解决方法吗?

我发现有关使用System.Web.Mvc.AuthorizeAttribute作为基础而不是System.Web.Http.AuthorizeAttribute的Stack文章,但签名有所不同,目前还不清楚是否会对Thread.CurrentPrincipal获取重置问题采取任何措施

1 个答案:

答案 0 :(得分:0)

不确定是否有人有更好的答案(除了告诉我重写整个应用程序"新的方式")但我找到了解决方法。

我在我们的IsAuthorized()函数中从我们的授权中分解了我们的身份验证逻辑,并将它放在MessageHandler中,希望能够在设置Thread.CurrentPrincipal的流程中尽早处理它。这似乎有效。