我遇到了 WCF、流式传输和安全性问题,这不是最大的问题,但我想了解人们对如何解决它的想法。
我需要允许客户端将文件上传到服务器,我通过使用 BasicHttpBinding 的 transferMode="StreamedRequest" 功能来允许这样做。当他们上传文件时,我想将此文件以事务方式放置在文件系统中,并使用文件的元数据更新数据库(我实际上使用的是 Sql Server 2008 的 FILESTREAM 数据类型,它本机支持这一点)。我正在使用 WCF Windows 身份验证并将 Kerberos 凭据委托给 SQL Server 以进行我的所有数据库身份验证。
问题是,正如我得到有用的注释,“HTTP 请求流不能与 HTTP 身份验证结合使用”。因此,对于我的上传文件服务,我无法将 Windows 身份验证令牌与消息调用一起传递。即使我没有使用 SQL Server 登录,我什至无法通过他们的 Windows 凭据识别我的调用客户端。
我暂时解决了这个问题,让上传方法不安全,并将文件转储到临时存储并返回定位器 GUID。然后,客户端再次调用安全的非流式服务,传递 GUID,该 GUID 使用 Windows 身份验证将文件从临时存储上传到数据库。
显然,这并不理想。从性能的角度来看,我正在对磁盘进行额外的读/写。从可扩展性的角度来看,(原则上,使用负载均衡器)不能保证我在随后的两个调用中访问同一台服务器,这意味着临时文件存储需要位于共享位置,这意味着不是可扩展的设计.
有人能想出更好的方法来处理这种情况吗?就像我说的那样,这不是最大的交易,因为 a) 我真的不需要扩展这个东西,没有太多的用户,b) 这些上传/下载并没有被调用很多。但是,我仍然想知道我是否在这里遗漏了一个明显的解决方案。
谢谢,丹尼尔