我们正在使用UserNamePasswordValidator
和IAuthorizationPolicy
将自定义角色数据加载到IPrincipal
对象中,以便在我们的服务器端进行身份验证和一些业务级别权限。
因此,我们在服务操作中使用Thread.CurrentPrincipal
来测试权限等。冒着比我应该更多技术的风险,这是static
类的Thread
属性这意味着它有 实例范围 全局 scpope(呃,谢谢Thilak)。我是否应该因为性能原因将我的InstanceContextMode
更改为Single
,这个方案肯定会破坏?我知道Single
要求您编写线程安全的代码,因此本身不仅仅是配置更改。
在我需要关注此问题之前,您是否还请分享任何关于WCF应该能够处理的实例加载的权威文本的链接?
答案 0 :(得分:0)
这是一个链接
http://msdn.microsoft.com/en-us/magazine/cc948343.aspx
这是我的2美分:
Thread.CurrentPrincipal是静态的。这意味着它具有全局范围而不是实例范围。但是,它也恰好具有线程亲和性...即该属性标记为[ThreadStatic] ...这意味着它具有全局范围,仅适用于当前线程。这在你的场景中是个好消息,因为使用Thread.CurrentPrincipal的代码不需要改变你是否处于单例模式。
P.S。检查IAuthorizationPolicy运行的Thread上下文。我在过去通过一些疯狂的,注入的安全策略设置Thread.CurrentPrincipal,明确地回忆起了痛点。确保您的IAuthorizationPolicy中运行的线程与调用Service方法的线程相同。