我们有一个Web Api应用程序已经工作了很长时间。
我们已经实施了自己的System.Web.Http.AuthorizeAttribute
来初始化我们的用户状态和角色提供程序,并且在 IsAuthorized()的重载期间,我们设置了HttpContext.Current.User
和Thread.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
获取重置问题采取任何措施
答案 0 :(得分:0)
不确定是否有人有更好的答案(除了告诉我重写整个应用程序"新的方式")但我找到了解决方法。
我在我们的IsAuthorized()函数中从我们的授权中分解了我们的身份验证逻辑,并将它放在MessageHandler中,希望能够在设置Thread.CurrentPrincipal的流程中尽早处理它。这似乎有效。