我有一个在 Windows/IIS 下运行的 Web 应用程序,其中包括一些通过 SSRS 的报告。
我希望能够呈现报告,以某种方式将其保存在 Web 或 SSRS 文件系统上,创建加密版本,并将该加密文件交付给用户。
我考虑过创建一个带有密码的 zip 文件,但不确定它的效果如何。
最好的方法是什么?
我有一个在 Windows/IIS 下运行的 Web 应用程序,其中包括一些通过 SSRS 的报告。
我希望能够呈现报告,以某种方式将其保存在 Web 或 SSRS 文件系统上,创建加密版本,并将该加密文件交付给用户。
我考虑过创建一个带有密码的 zip 文件,但不确定它的效果如何。
最好的方法是什么?
您需要在项目中引用http://<Server Name>/ReportServer/ReportExecution2005.asmx
. 请参阅ReportExecutionService.Render 方法中包含的示例,了解如何执行和呈现报告。然后,您可以从 render 方法中获取返回的字节数组,并基于它创建一个 MemoryStream。
您可以使用System.IO.Compression 命名空间中的东西执行简单的压缩,如下所示:
public void CompressData(Stream uncompressedSourceStream, Stream compressedDestinationStream)
{
using (DeflateStream compressionStream = new DeflateStream(compressedDestinationStream, CompressionMode.Compress))
{
uncompressedSourceStream.CopyTo(compressionStream);
}
}
public void DecompressData(Stream compressedSourceStream, Stream uncompressedDestinationStream)
{
using (DeflateStream decompressionStream = new DeflateStream(uncompressedDestinationStream, CompressionMode.Decompress))
{
compressedSourceStream.CopyTo(decompressionStream);
}
}
using (FileStream sourceStream = File.OpenRead(@"C:\MyDir\MyFile.txt))
using (FileStream destinationStream = File.OpenWrite(@"C:\MyDir\MyCompressedFile.txt.cp"))
{
CompressData(sourceStream, destinationStream)
}
有关如何加密数据的信息,请参阅AesCryptoServiceProvider 类。修改示例以加密流而不是字符串应该不难。
也可以向用户颁发证书并在此基础上执行加密/解密,但它更复杂。为此,您需要查看System.Security.Cryptography.X509Certificates Namespace。
这有几个问题 - 我必须假设加密的目的是您希望能够以只有授权用户才能查看的方式分发报告。
实现此目标的最简单方法是使用登录方案,并通过 HTTPS 提供报告。这意味着只有登录的人才能下载报告,并且无法使用网络嗅探来拦截。
过去,一位客户坚称他们希望避免允许用户下载未加密的文件,因为他们可能会将(未加密的)报告转发给未经授权的用户。为了满足这个要求,我们创建了一个创建加密 ZIP 文件的 windows 服务;我们使用了一项服务,因为性能测试表明在 Web 请求的上下文中创建 ZIP 会产生严重的可伸缩性问题。
这个方案的主要问题是分发解密密钥;确保每个人都有正确的报告密钥是背后的巨大痛苦。
它也没有阻止用户解密 ZIP 文件并通过电子邮件发送未加密的报告——但这显然违反了 IT 政策,这对于未加密的报告来说更难做到。
也许是 7-zip 或 TrueCrypt?
然而,两者都需要安装额外的软件。我真的不确定 ZIP 文件密码保护有多强,所以如果不做一些研究,我会犹豫走这条路。
据我了解,TrueCrypt 非常安全。