WCF,自定义成员资格提供程序和HttpContext

时间:2009-11-28 16:45:06

标签: wcf security state

好的,我真的要在这里展示我对ASP.NET安全模型的愚蠢,但是这里有。

我有一个WCF Web服务,我已经设法破解了我的方式来管理我的自定义成员资格提供程序。

我的会员提供程序会覆盖“ValidateUser”,我尝试使用SQL Server实例中的数据加载用户对象。到目前为止一切都很好,我检索信用卡,加载用户对象,如果我没有遇到任何颠簸,返回true。

此时,我通常会将用户对象(或id)填充到会话中,或者实际上只是一些在请求生命周期内可访问的状态包。我遇到的问题是HttpContext此时为空,即使我使用ASP兼容性属性。

我还有哪些其他选择? 干杯,克里斯。

修改

只是为了澄清我想做什么。我想传递用户凭据以在服务器上进行身份验证,一旦发生这种情况,我想保留经过身份验证的用户的详细信息某处我可以访问生命周期服务请求仅限。这将是Http.Current.Items的等价物?

是否存在每个请求实例化的对象,我可以通过静态属性全局访问(即以类似于HttpContext.Current的方式)?我假设OperationContext就是这个,但这也是null?

这真的是一个不常见的问题吗?发送信用卡>检索用户>在处理请求的过程中,用户可以访问某个地方。对我来说似乎很常见,我错过了什么?

干杯,克里斯。

1 个答案:

答案 0 :(得分:0)

基本上,对于WCF,首选的最佳实践解决方案是使用每次呼叫激活,例如每个新的请求/调用都会获得一个新的服务类实例,并为每个请求完成所有必要的步骤,如身份验证和授权。

这可能听起来效率低下,但网络应用程序,特别是Web服务,应尽可能完全无状态。把东西放在“状态包”中只是为了解决问题 - 你怎么知道何时使凭证的缓存副本无效?如果用户存在您的应用但cookie仍保留在他的计算机上怎么办?

总而言之,我强烈建议尝试每次都习惯这样做的想法。是的,它需要花费一点处理时间 - 但另一方面,你可以在一个固有的无状态环境中从状态管理方面避免很多悲伤 - 无论你如何看待它,总是一块垃圾。 ..

如果您仍然坚持使用该kludge,您可以为WCF启用ASP.NET“compabitility”模式,这样可以让您访问HttpContext - 但是再次:我强烈建议不要使用它。第一个也是最明显的限制是,这种ASP.NET兼容模式当然只适用于在IIS中托管WCF服务 - 我自己也不愿意在生产代码中这样做。

要打开ASP.NET兼容模式,请在web.config中使用此设置:

<system.serviceModel>
   <serviceHostingEnvironment 
        aspNetCompatibilityEnabled="true"/>
</system.serviceModel>

您需要使用相应的属性来装饰您的服务实现(实现服务合同的类):

[AspNetCompatibilityRequirements(RequirementsMode=
       AspNetCompatibilityRequirementsMode.Allowed)]
class YourService : IYourService

AspNetCompatibilityRequirementsMode可以是NotAllowedAllowedRequired

有关更多信息和更详尽的解释,请参阅Wenlong Dong关于ASP.NET Compatibility Mode

的博客文章